背景:我们都晓得泛型本质上是供应范例的"范例参数",它们也被称为参数化范例(parameterized type)或参量多态(parametric polymorphism)。实在泛型头脑并非 Java 最早引入的,C++ 中的模板就是一个应用泛型的例子。
(引荐视频:java视频教程)
GJ(Generic Java)是对 Java 言语的一种扩大,是一种带有参数化范例的 Java 言语。用 GJ 编写的顺序看起来和平常的 Java 顺序基础雷同,只不过多了一些参数化的范例同时少了一些范例转换。实际上,这些 GJ 顺序也是起首被转化成平常的不带泛型的 Java 顺序后再举行处置惩罚的,编译器自动完成了从 Generic Java 到平常 Java 的翻译。
什么是实在的java泛型
我们都晓得编译器会举行泛型擦除,编译器能够在对源顺序(带有泛型的 Java 代码)举行编译时运用泛型范例信息保证范例平安,对大批假如没有泛型就不会去考证的范例平安束缚举行考证,同时在生成的字节码当中,将这些范例信息清撤除。下面我们先考证一下:
public static void main(String[] args) { ArrayList<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); ints.add(3); ArrayList<String> sts = new ArrayList<String>(); sts.add("a"); sts.add("b"); sts.add("c"); System.out.println(ints.getClass() == sts.getClass()); }
上面打印的结果是true,原因是
根据明白,泛型擦除后将不能找回本来的范例,都是Object情势的,真的云云吗?
看一下以下代码:
import java.lang.reflect.ParameterizedType;import java.util.ArrayList;import java.util.List;public class ClassTest { public static void main(String[] args) throws Exception { ParameterizedType type = (ParameterizedType) Bar.class.getGenericSuperclass(); System.out.println(type.getActualTypeArguments()[0]); ParameterizedType fieldType = (ParameterizedType) Foo.class.getField("children").getGenericType(); System.out.println(fieldType.getActualTypeArguments()[0]); ParameterizedType paramType = (ParameterizedType) Foo.class.getMethod("foo", List.class) .getGenericParameterTypes()[0]; System.out.println(paramType.getActualTypeArguments()[0]); System.out.println(Foo.class.getTypeParameters()[0] .getBounds()[0]); } class Foo<E extends CharSequence> { public List<Bar> children = new ArrayList<Bar>(); public List<StringBuilder> foo(List<String> foo) {return null; } public void bar(List<? extends String> param) {} } class Bar extends Foo<String> {} }
打印出
class java.lang.Stringclass com.javapuzzle.davidwang456.ClassTest$Barclass java.lang.Stringinterface java.lang.CharSequence
你会发明每个范例参数都被保存了,而且在运行期能够经由过程反射机制获取到。那末究竟什么是“范例擦除”?最少某些东西被擦除了吧?是的。事实上,除了构造化信息外的统统东西都被擦除了 —— 这里构造化信息是指与类构造相干的信息,而不是与顺序实行流程有关的。换言之,与类及其字段和要领的范例参数相干的元数据都会被保存下来,能够经由过程反射获取到。
本文来自ki4网,java教程栏目,迎接进修!
以上就是java范例擦除真的能完整擦除统统信息吗?的细致内容,更多请关注ki4网别的相干文章!