泛型上下限

来源:互联网 发布:Java多线程是并行的吗 编辑:程序博客网 时间:2024/05/05 10:48
1.Toy类
public class Toy {
}

2.SubToy类
public class SubToy extends Toy{
}

3.SubToy2类
public class SubToy2 extends Toy{

}

4.main类

import java.util.ArrayList;
import java.util.List;

public class main {

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
}
}
0 0
原创粉丝点击