泛型通配符规则
Posted chenloveslife
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了泛型通配符规则相关的知识,希望对你有一定的参考价值。
1. 为什么使用通配符
通配符的使用可以对泛型参数做出某些限制,使代码更安全。我们知道数组是可以协变的,当涉及到泛型时,尽管B是A的子类型,但是 ArrayList<B>
不是 ArrayList<A>
的子类型,二者没有关系,泛型不支持协变,这个时候就要需要通配符来解决这个问题。
2. 使用规则
(1) “?”不能添加元素
当“?”为类型变量的,不能往集合中添加元素,甚至不能用Object调用,Pair<?>和Pair本质的不同在于:可以用任意Object对象调用原始Pair类的setObject方法。
(2) "?" extends T不能添加元素
因为编译器只需要知道某个Employee的子类型,但是不知道是什么类型,所以拒绝任何特定类型。但是可以返回子类型限定的对象。
1 Pair<Manager> managerPair = new Pair<>(ceo, cfo);
2 Pair<? extends Employee> employeePair = managerPair;
3 //employeePair.setFirst(coo); //不可调用setFirst方法,因为编译器只需要知道某个Employee的子类型,但是不知道是什么类型,所以拒绝任何特定类型
4 Employee e = employeePair.getFirst(); //合法
(3) “? super T”能添加元素,也能返回对象类型,但只能赋值给Object类
1 Pair<Employee> employeePair = new Pair<>(idiot, idiot1);
2 Pair<? super Manager> managerPair = employeePair;
3 Object obj = managerPair.getFirst(); //不能保证返回对象的类型,所以只能赋值给Object类
4 managerPair.setFirst(ceo); //可以为方法提供参数,但只能提供超类型限定的对象
3. 总结
带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象获取
以上是关于泛型通配符规则的主要内容,如果未能解决你的问题,请参考以下文章
Java 泛型泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )