水平有限,只放自己的简单理解,下面推荐相关优秀博客链接
泛型是指可以将类型当做参数,传递给一个类或方法。
而java的泛型是伪泛型,因为,在编译期间,所有的泛型信息都会被擦除掉,这个过程就叫做类型擦除。
1.理解类型擦除
public static void main(String[] args) {
List<Integer> arrayList1 = new ArrayList<>();
List<String> arrayList2 = new ArrayList<>();
System.out.println(arrayList1.getClass() == arrayList2.getClass());
}
由于类型擦除的存在,编译后JVM只能看见List(准确地来说是ArrayList)对象,无法得知需要存储不同的数据类型。
2.运用泛型
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.getClass().getMethod("add", Object.class).invoke(arrayList, "a");
arrayList.add("1");
通过反射机制,我们能够在ArrayList中存储字符串,这是因为反射是在运行时调用add方法的,此时类型擦除已经生效了。
但是如果试图直接添加字符串,则会报编译错误。
这是因为Java编译器先检查代码中泛型的类型,然后进行类型擦除。