本帖最后由 李知伦 于 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
-
-
- }
-
复制代码 |