关键词:ParameterizedType ,WildcardType, GenericDeclaration, GenericArrayType, TypeVariable
ParameterizedType是Type的子接口,表示一个有参数的类型,例如Collection<T>,Map<K,V>等,实际上代表一个泛型的实例.
getActualTypeArguments 获取泛型示例中的泛型变量,这个值是一个类型。因为可能有多个“泛型变量”(如:Map<K,V>),所以返回的是一个Type[]。
无论<>中有几层<>嵌套,这个方法仅仅脱去最外层的<>,之后剩下的内容就作为这个方法的返回值,所以其返回值类型是不确定的。
煮个栗子:
List<ArrayList> a1;//返回ArrayList,Class类型
List<ArrayList<String>> a2;//返回ArrayList<String>,ParameterizedType类型
List<T> a3;//返回T,TypeVariable类型
List<? extends Number> a4; //返回? extends Number,WildcardType类型
List<ArrayList<String>[]> a5;//返回ArrayList<String>[],GenericArrayType 类型
泛型为什么不能声明数组
List<Integer>[] li2 = new ArrayList<Integer>[];
List<Boolean> li3 = new ArrayList<Boolean>[];
泛型被擦除之后,变为List<Object> 但是要求插入的是Integer类型,此处有歧义,因此禁止。
修改:
List<?>[] li4 = new ArrayList<?>[10];
li4[1] = new ArrayList<Stirng>();
List<?> v = li3[1];
通过反射可以正常存取数据吗?
可以的,在参考文档中可以看出来。
引入通配符的作用 super extends ?
<?>被称作无限定的通配符
<? extends T>被称作有上限的通配符
<? super T>被称作有下限的通配符
通常是先定义一个具体的类型,然后根据对象之间的关系,赋值给<? extends T> 或者<? super T>
如:
List<Integer> iList = new ArrayList<>();
iList.add(11);
iList.add(22);
List<Float> fList = new ArrayList<>();
fList.add((float) 11);
fList.add((float) 22);
List<? extends Number> elems = iList;
System.out.print(elems.get(0));
elems = fList;
System.out.print(elems.get(0));
super和extends对应于类型赋值时的对应关系。如Fruit 是Apple的父类因此可以赋值:
image.png
总结:通配符类型的限定是防止自己定义的数据结构在后续修改时,加入或者获取不匹配的类型,能够起到一个提示限定的作用,常用于列表赋值。
原有链接
链接:https://www.jianshu.com/p/cfa74c980b25
链接:https://blog.csdn.net/briblue/article/details/76736356
网友评论