标签:支持 man 规则 lis 变量 泛型 通配符 extend 返回
通配符的使用可以对泛型参数做出某些限制,使代码更安全。我们知道数组是可以协变的,当涉及到泛型时,尽管B是A的子类型,但是 ArrayList<B>
不是 ArrayList<A>
的子类型,二者没有关系,泛型不支持协变,这个时候就要需要通配符来解决这个问题。
当“?”为类型变量的,不能往集合中添加元素,甚至不能用Object调用,Pair<?>和Pair本质的不同在于:可以用任意Object对象调用原始Pair类的setObject方法。
因为编译器只需要知道某个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(); //合法
1 Pair<Employee> employeePair = new Pair<>(idiot, idiot1);
2 Pair<? super Manager> managerPair = employeePair;
3 Object obj = managerPair.getFirst(); //不能保证返回对象的类型,所以只能赋值给Object类
4 managerPair.setFirst(ceo); //可以为方法提供参数,但只能提供超类型限定的对象
带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象获取
标签:支持 man 规则 lis 变量 泛型 通配符 extend 返回
原文地址:https://www.cnblogs.com/chenloveslife/p/8783264.html