写了点代码,试了一下java泛型,上限和下限的问题。经验不足,讲的不好的地方轻拍。
1.Toy类
package fanxing; |
public class Toy { |
} |
2.SubToy类
package fanxing; |
public class SubToy extends Toy{ |
|
} |
3.SubToy2类
package fanxing; |
public class SubToy2 extends Toy{ |
|
} |
4.main类
01 | package fanxing; |
02 |
03 | import java.util.ArrayList; |
04 | import java.util.List; |
05 |
06 | public class main { |
07 |
08 | /** |
09 | * @param args |
10 | * @throws IllegalAccessException |
11 | * @throws InstantiationException |
12 | */ |
13 | public static void main(String[] args) throws Exception{ |
14 | Toy toy = new Toy(); |
15 | SubToy subToy = new SubToy(); |
16 | SubToy subToy2 = new SubToy(); |
17 | |
18 | List<? extends Toy> list = new ArrayList<Toy>(); //表示所持有对象是Toy子类 |
19 | List<? extends Toy> list1 = new ArrayList<SubToy>(); //表示所持有对象是Toy的子类 |
20 | |
21 | // list.add(toy); 错误的 因为list所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型, |
22 | // list.add(subToy); 错误的,理由同上 |
23 | // list.add(subToy2); 错误的,理由同上 |
24 | |
25 | // list1.add(toy); 错误的 因为list1所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型, |
26 | // list1.add(subToy); 错误的,理由同上 |
27 | // list1.add(subToy2); 错误的,理由同上 |
28 | |
29 | |
30 | |
31 | List<? super Toy> list2 = new ArrayList<Toy>(); //所持有对象为Toy的超类,下限为Toy,所以可以add() Toy及Toy的子类 |
32 | list2.add(toy); |
33 | list2.add(subToy); |
34 | list2.add(subToy2); |
35 | |
36 | // List<? super Toy> list3 = new ArrayList<SubToy>(); 错误的,所持有对象为Toy的超类,下限为Toy, |
37 | // 所以不可以超过下限Toy,将ArrayList泛型指定为SubToy |
38 |
39 | |
40 | List<? super SubToy> list4 = new ArrayList<Toy>(); //所持有对象为SubToy的超类,下限为SubToy , |
41 | //可以将ArrayList泛型指定为Toy |
42 | // list4.add(toy); 错误的,因为虽然持有对象为SubToy的超类,但是容器不知道具体的类型是超类还是子类,所以不能放入超类,但是子类的话就可以的 |
43 | list4.add(subToy); |
44 | list4.add(subToy2); |
45 | |
46 | List<? super SubToy> list5 = new ArrayList<SubToy>(); //所持有对象为SubToy的超类,下限为SubToy , |
47 | //可以将ArrayList泛型指定为SubToy |
48 | // list5.add(toy); 错误的,理由同list4 |
49 | list5.add(subToy); |
50 | list5.add(subToy2); |
51 | |
52 | // List<? super SubToy> list6 = new ArrayList<SubToy2>(); 错误的,所持有对象为SubToy的超类,下限为SubToy , |
53 | // 所以持有的对象可能为Toy,也可能为SubToy ,也就不能将具体的实现的泛型指定为SubToy2 |
54 | |
55 | |
56 | } |
57 |
58 | } |