Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。
泛型的好处有两个:
Java中的泛型通过类型擦除的方式来实现,通俗点理解,就是通过语法糖的形式,在.java->.class转换的阶段,将List
✅泛型中上下界限定符extends 和 super有什么区别?
通过反射可以实现:
public void test() throws Exception {
ArrayList<Integer> list = new ArrayList<Integer>();
Method method = list.getClass().getMethod("add", Object.class);
method.invoke(list, "Java反射机制实例");
System.out.println(list.get(0));
}
所谓协变,可以简单理解为因为Object是String的父类,所以Object[]同样是String[]的父类,这种情况Java是允许的;但是对于泛型来说,List
为什么要这样设计呢,如果泛型允许协变(实际上以下代码第一步就会编译失败),考虑如下例子:
List<Object> a = new List<String>();
a.add(1); // 允许协变,可以装进来
String s = a.get(0); // 编译报错
但是,为什么泛型不允许协变,而数组允许协变呢?原因有二:
Arrays.equals(Object[], Object[])
方法,是时代无奈的产物