假设有一个继承体系,父类是Employee,它有很多子类代表不同的雇员,其中一个子类是Manager.
然后Manager下面也有很多子类,代表不同的部门经理.在使用泛型进行编程的时候,有下面三种形式:
Pair<Manager>
Pair<? extends Manager>
Pair<? super Manager>其中第一种形式和第二种形式我已经搞清楚了,关键是第三种形式我理解不了,我怎么看<? super Manager>都觉得和第二种形式<? extends Manager>一样,大家能帮我解释下<? super Manager>和<? extends Manager>的区别是什么么,讲的细点,谢谢大家!
然后Manager下面也有很多子类,代表不同的部门经理.在使用泛型进行编程的时候,有下面三种形式:
Pair<Manager>
Pair<? extends Manager>
Pair<? super Manager>其中第一种形式和第二种形式我已经搞清楚了,关键是第三种形式我理解不了,我怎么看<? super Manager>都觉得和第二种形式<? extends Manager>一样,大家能帮我解释下<? super Manager>和<? extends Manager>的区别是什么么,讲的细点,谢谢大家!
<? extends Manager>取的是从Manager开始的继承体系的下段,
<? super Manager>取的是从Manager开始的继承体系的上段.
在继承树上,能支持 Manager 父类的那个节点下的所有分支
class ListUse{
/**
* 以int格式打印任意一种Number型list的值
*/
public void useUpper(List<? extends Number> list){
// 1. list中存入的一定是Number的子类
// 2. list中取出的只知道是Number,而无法区分是Integer还是Double等
// 3. 无法向List中add数据,因为我们不知道List中存的到底是什么Number的哪个子类.
// 结论: 以父类的形式无差别的处理各种子类型泛型中的子类型数据
// (以父类Number类型无差别的处理List中的子类型对象.)
for(Number n:list){
System.out.println(n.intValue());
}
}
/**
* 为任意一个Integer父类型的List容器加入10个随机的int数据.
*/
public void useLower(List<? super Integer> list){
// 1. list中一定可以存放Integer,因为那里定义的是Integer的父类
// 2. list中读出的数据未必是Integer.只有一点是肯定的,那就是它一定是个Object.
// 3. 为List提供的数据必须是Integer或它的子类型,因为无法确定List中规定的类型是Number的哪一级父类型.
// 结论: 将某一类对象无差别的提供给它的各种父类型的泛型使用
// (将Integer对象无差别的提供给各种父类型List使用)
Random rnd=new Random();
for(int i=0; i<10; i++){
list.add(rnd.nextInt());
}
}
}