|
9 | 9 | 通配符: 以下是 `Java` 中泛型方法的类型: |
10 | 10 |
|
11 | 11 | ```java |
12 | | - interface Collection<E> { |
| 12 | +interface Collection<E> { |
13 | 13 | ... |
14 | 14 | public boolean contains(Object o); |
15 | 15 | public boolean containsAll(Collection<?> c); |
16 | 16 | ... |
17 | | - } |
| 17 | +} |
18 | 18 | ``` |
19 | 19 |
|
20 | 20 | 第一种方法根本不使用泛型! 第二种方法是我们第一次看到一个重要的缩写。 类型 `Collection <?>` 代表: |
21 | 21 |
|
22 | 22 | ```java |
23 | | - Collection<? extends Object> |
| 23 | +Collection<? extends Object> |
24 | 24 | ``` |
25 | 25 |
|
26 | 26 | 扩展对象是通配符最常用的用法之一,所以提供一个简短的表单来编写它是有意义的. |
27 | 27 |
|
28 | 28 | 这些方法让我们测试成员和遏制: |
29 | 29 |
|
30 | 30 | ```java |
31 | | - Object obj = "one"; |
32 | | - List<Object> objs = Arrays.<Object>asList("one", 2, 3.14, 4); |
33 | | - List<Integer> ints = Arrays.asList(2, 4); |
34 | | - assert objs.contains(obj); |
35 | | - assert objs.containsAll(ints); |
36 | | - assert !ints.contains(obj); |
37 | | - assert !ints.containsAll(objs); |
| 31 | +Object obj = "one"; |
| 32 | +List<Object> objs = Arrays.<Object>asList("one", 2, 3.14, 4); |
| 33 | +List<Integer> ints = Arrays.asList(2, 4); |
| 34 | +assert objs.contains(obj); |
| 35 | +assert objs.containsAll(ints); |
| 36 | +assert !ints.contains(obj); |
| 37 | +assert !ints.containsAll(objs); |
38 | 38 | ``` |
39 | 39 |
|
40 | 40 | 给定的对象列表包含字符串 “one” 和给定的整数列表,但给定的整数列表不包含字符串 “one”,也不包含给定的对象列表。 |
|
43 | 43 | 这样的测试可能会成功: |
44 | 44 |
|
45 | 45 | ```java |
46 | | - Object obj = 1; |
47 | | - List<Object> objs = Arrays.<Object>asList(1, 3); |
48 | | - List<Integer> ints = Arrays.asList(1, 2, 3, 4); |
49 | | - assert ints.contains(obj); |
50 | | - assert ints.containsAll(objs); |
| 46 | +Object obj = 1; |
| 47 | +List<Object> objs = Arrays.<Object>asList(1, 3); |
| 48 | +List<Integer> ints = Arrays.asList(1, 2, 3, 4); |
| 49 | +assert ints.contains(obj); |
| 50 | +assert ints.containsAll(objs); |
51 | 51 | ``` |
52 | 52 |
|
53 | 53 | 在这种情况下,对象可能被包含在整数列表中,因为它碰巧是一个整数,并且对象列表可能包含在整数列表中,因为列表中的每个对象碰巧是一个整数。 - 类型参数你 |
54 | 54 | 可以合理地选择一个替代设计的集合- 只能测试元素类型的子类型的容器的设计: |
55 | 55 |
|
56 | 56 | ```java |
57 | | - interface MyCollection<E> { // alternative design |
| 57 | +interface MyCollection<E> { // alternative design |
58 | 58 | ... |
59 | 59 | public boolean contains(E o); |
60 | 60 | public boolean containsAll(Collection<? extends E> c); |
61 | 61 | ... |
62 | | - } |
| 62 | +} |
63 | 63 | ``` |
64 | 64 |
|
65 | 65 | 假设我们有一个实现 `MyCollection` 的 `MyList` 类。 现在这些测试是合法的,只有一个方法: |
66 | 66 |
|
67 | 67 | ```java |
68 | | - Object obj = "one"; |
69 | | - MyList<Object> objs = MyList.<Object>asList("one", 2, 3.14, 4); |
70 | | - MyList<Integer> ints = MyList.asList(2, 4); |
71 | | - assert objs.contains(obj); |
72 | | - assert objs.containsAll(ints) |
73 | | - assert !ints.contains(obj); // 编译报错 |
74 | | - assert !ints.containsAll(objs); // 编译报错 |
| 68 | +Object obj = "one"; |
| 69 | +MyList<Object> objs = MyList.<Object>asList("one", 2, 3.14, 4); |
| 70 | +MyList<Integer> ints = MyList.asList(2, 4); |
| 71 | +assert objs.contains(obj); |
| 72 | +assert objs.containsAll(ints) |
| 73 | +assert !ints.contains(obj); // 编译报错 |
| 74 | +assert !ints.containsAll(objs); // 编译报错 |
75 | 75 | ``` |
76 | 76 |
|
77 | 77 | 最后两个测试是非法的,因为类型声明要求我们只能测试一个列表是否包含该列表的一个子类型的元素。所以我们可以检查一个对象列表是否包含整数列表,而不是相 |
|
0 commit comments