黑马程序员技术交流社区
标题:
泛型上下线
[打印本页]
作者:
毛标
时间:
2012-8-19 21:49
标题:
泛型上下线
回头在看泛型总感觉很难明白,不知道使用上下限的方法
、<? extends Number> 只允许泛型为Number及Number子类的引用调用
、<? super Number> 只允许泛型为Number及Number父类的引用调用
想上面这样说的,我可以理解为存在这么一种情况就是这个Number定义了之后可以吧这2句实现成1个?
作者:
李知伦
时间:
2012-8-20 08:00
本帖最后由 李知伦 于 2012-8-20 08:06 编辑
//意思是只能调用,不能更改,希望代码能帮你理解
import java.util.ArrayList;
import java.util.List;
class Toy {}
class SubToy extends Toy{}
class SubToy2 extends Toy{}
public class main {
/**
* @param args
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws Exception{
Toy toy = new Toy();
SubToy subToy = new SubToy();
SubToy subToy2 = new SubToy();
List<? extends Toy> list = new ArrayList<Toy>();//表示所持有对象是Toy子类
List<? extends Toy> list1 = new ArrayList<SubToy>();//表示所持有对象是Toy的子类
// list.add(toy); 错误的 因为list所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,
// list.add(subToy); 错误的,理由同上
// list.add(subToy2); 错误的,理由同上
// list1.add(toy); 错误的 因为list1所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,
// list1.add(subToy); 错误的,理由同上
// list1.add(subToy2); 错误的,理由同上
List<? super Toy> list2 = new ArrayList<Toy>();//所持有对象为Toy的超类,下限为Toy,所以可以add() Toy及Toy的子类
list2.add(toy);
list2.add(subToy);
list2.add(subToy2);
// List<? super Toy> list3 = new ArrayList<SubToy>(); 错误的,所持有对象为Toy的超类,下限为Toy,
// 所以不可以超过下限Toy,将ArrayList泛型指定为SubToy
List<? super SubToy> list4 = new ArrayList<Toy>();//所持有对象为SubToy的超类,下限为SubToy ,
//可以将ArrayList泛型指定为Toy
// list4.add(toy); 错误的,因为虽然持有对象为SubToy的超类,但是容器不知道具体的类型是超类还是子类,所以不能放入超类,但是子类的话就可以的
list4.add(subToy);
list4.add(subToy2);
List<? super SubToy> list5 = new ArrayList<SubToy>();//所持有对象为SubToy的超类,下限为SubToy ,
//可以将ArrayList泛型指定为SubToy
// list5.add(toy); 错误的,理由同list4
list5.add(subToy);
list5.add(subToy2);
// List<? super SubToy> list6 = new ArrayList<SubToy2>(); 错误的,所持有对象为SubToy的超类,下限为SubToy ,
// 所以持有的对象可能为Toy,也可能为SubToy ,也就不能将具体的实现的泛型指定为SubToy2
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2