在泛型代码内部,无法获得任何有关泛型参数类型的信息。
例如:
public class TypeValue{
public static void main(String[] args){
Class c1 = new ArrayList<String>().getClass();
Class c2 = new ArrayList<String>().getClass();
System.out.println(c1==c2);
}
}
输出的结果是true
按照我们的意愿应该输出false,他们应该是不同的类型String和Integer,和输出的却是相同的类型,但是如果你吧
Integer放入ArrayList<Integer>中可以,放入ArrayList<String>却不可以,他们是相同的类型,却又不能放进Integer,很迷惑
下面的例子可解密
public class LostInformation{
public static void main(Stirng[] args){
List<Frob> list = new ArrayList<Frob>();
Map<Frob,Fnorkle> map = new HashMap<Frob,Fnorkle>();
Quark<Fnorkle> quark = new Quark<Fnorkle>();
System.out.println(Arrays.toString(
map.getClass().getTypeParameters());
System.out.println(Arrays.toString(
list.getClass().getTypeParameters());
System.out.println(Arrays.toString(
quark.getClass().getTypeParameters());
}
}
输出:[E]
[K,V]
[Q]
说明:Class.getTypeParameters()将“返回一个TypeVariable对象数组,表示有泛型申明所申明的类型参数”
结果就是
在泛型代码内部,无法获得任何有关泛型参数类型的信息
java的泛型是使用擦除来实现的,这意味当我们在使用泛型的时候,任何具体的类型信息都被擦除了,我们唯一知道的是我们在使用一个对象,因此List<String>和List<Integer>在运行时候的类型是相同的,这俩中类型都被查出了原始的类型即List.
边界<T extends HasF>申明T必须具备有类型HasF或者从HasF继承的类型,