本质:参数化类型
伪泛型: 只在程序源码中存在,在编译后的字节码文件中,已经被替换为原始类型
原始类型: 擦去了泛型信息,最后在字节码中的类型变量的真正类型
类型擦除: 使用泛型时加上的类型参数,会在编译中去掉,对运行时期的Java来说,
ArrayList<Integer>与ArrayList<String>就是同一个类
要求及规则:不能使用基本类型
不管该限定是类还是接口,都统一使用关键字extends
可以使用&符号给出多个限定
如果限定既有接口又有类,那类只有一个,放首位
限定通配符:<? extends T>类型必须是T的子类
<? super T>类型必须是T的父类
非限定通配符:<?>可以是任意类型
可以把List<String>传递给接受List<Object>参数的方法吗?
不可以,出现编译错误
List<Object> objList;
List<String> strList;
objList=strLsit;//错
List<Object> 可储存任何类型对象,而List<String>只能存String
Java规定不能使用泛型类型的数组:
Generics<String> genArr[]=new Generics<String>[10];//错
编译时会进行泛型擦除,向其中插入其他类型时
会抛出ArrayStoreExecption异常
List<Object>与原始类型List之间的区别?
在编译时,编译器会对带参数的类型进行检查,通过使用Object可告知编译器该方法可以接受任何类型对象,
我们可以把任何带参数类型传递给List,却不能把List<String>传递给List<Object>
List<?> 与List<Object>之间的区别?
List<?>是未知类型的,而List<Object>是任意类型的List。
可以把List<String>,List<Integer>赋值给List<?>,却不能赋值给List<Object>