|
1 | 1 | 《《《 [返回首页](../README.md) <br/> |
2 | 2 | 《《《 [上一节](05_Arrays.md) |
3 | 3 |
|
4 | | -## 通配符与类型参数 |
| 4 | +### 通配符与类型参数 |
5 | 5 |
|
6 | | -- `contains`方法检查集合是否包含给定的对象,并且其泛化`containsAll`检查集合是否包含另一个集合的每个元素。 |
7 | | -本部分介绍了为这些方法提供通用签名的两种替代方法。 第一种方法使用通配符,是`Java`集合框架中使用的通配符。 |
8 | | -第二种方法使用类型参数,通常是更合适的选择。 |
| 6 | +`contains` 方法检查集合是否包含给定的对象,并且其泛化 `containsAll` 检查集合是否包含另一个集合的每个元素。 本部分介绍了为这些方法提供通用签名的两种 |
| 7 | +替代方法。 第一种方法使用通配符,是 `Java` 集合框架中使用的通配符。 第二种方法使用类型参数,通常是更合适的选择。 |
9 | 8 |
|
10 | | -- 通配符: 以下是`Java`中泛型方法的类型: |
| 9 | +通配符: 以下是 `Java` 中泛型方法的类型: |
11 | 10 |
|
12 | 11 | ```java |
13 | 12 | interface Collection<E> { |
|
16 | 15 | public boolean containsAll(Collection<?> c); |
17 | 16 | ... |
18 | 17 | } |
19 | | - ``` |
20 | | -- 第一种方法根本不使用泛型! 第二种方法是我们第一次看到一个重要的缩写。 |
21 | | -类型`Collection <?>`代表: |
| 18 | + ``` |
| 19 | + |
| 20 | +第一种方法根本不使用泛型! 第二种方法是我们第一次看到一个重要的缩写。 类型 `Collection <?>` 代表: |
22 | 21 |
|
23 | 22 | ```java |
24 | 23 | Collection<? extends Object> |
25 | 24 | ``` |
26 | | -- 扩展对象是通配符最常用的用法之一,所以提供一个简短的表单来编写它是有意义的. |
| 25 | + |
| 26 | +扩展对象是通配符最常用的用法之一,所以提供一个简短的表单来编写它是有意义的. |
27 | 27 |
|
28 | | -- 这些方法让我们测试成员和遏制: |
| 28 | +这些方法让我们测试成员和遏制: |
29 | 29 |
|
30 | 30 | ```java |
31 | 31 | Object obj = "one"; |
|
36 | 36 | assert !ints.contains(obj); |
37 | 37 | assert !ints.containsAll(objs); |
38 | 38 | ``` |
39 | | -- 给定的对象列表包含字符串“one”和给定的整数列表,但给定的整数列表不包含字符串“one”, |
40 | | -也不包含给定的对象列表。 |
41 | | -- 测试`ints.contains(obj)`和`ints.containsAll(objs)`可能看起来很愚蠢。 |
42 | | -当然,整数列表将不包含任意对象,如字符串“one”。 但这是允许的, |
43 | | -因为有时这样的测试可能会成功: |
| 39 | + |
| 40 | +给定的对象列表包含字符串“one”和给定的整数列表,但给定的整数列表不包含字符串“one”,也不包含给定的对象列表。 |
| 41 | + |
| 42 | +测试 `ints.contains(obj)` 和 `ints.containsAll(objs)` 可能看起来很愚蠢。当然,整数列表将不包含任意对象,如字符串“one”。 但这是允许的,因为有时这 |
| 43 | +样的测试可能会成功: |
44 | 44 |
|
45 | 45 | ```java |
46 | 46 | Object obj = 1; |
|
49 | 49 | assert ints.contains(obj); |
50 | 50 | assert ints.containsAll(objs); |
51 | 51 | ``` |
52 | | -- 在这种情况下,对象可能被包含在整数列表中,因为它碰巧是一个整数,并且对象列表可能包含在整数列表中, |
53 | | -因为列表中的每个对象碰巧是一个整数。 |
54 | | -- 类型参数你可以合理地选择一个替代设计的集合 |
55 | | - - 只能测试元素类型的子类型的容器的设计: |
| 52 | + |
| 53 | +在这种情况下,对象可能被包含在整数列表中,因为它碰巧是一个整数,并且对象列表可能包含在整数列表中,因为列表中的每个对象碰巧是一个整数。 - 类型参数你 |
| 54 | +可以合理地选择一个替代设计的集合- 只能测试元素类型的子类型的容器的设计: |
56 | 55 |
|
57 | 56 | ```java |
58 | 57 | interface MyCollection<E> { // alternative design |
|
62 | 61 | ... |
63 | 62 | } |
64 | 63 | ``` |
65 | | -- 假设我们有一个实现`MyCollection`的`MyList`类。 现在这些测试是合法的, |
66 | | -只有一个方法: |
| 64 | + |
| 65 | +假设我们有一个实现 `MyCollection` 的 `MyList` 类。 现在这些测试是合法的,只有一个方法: |
67 | 66 |
|
68 | 67 | ```java |
69 | 68 | Object obj = "one"; |
|
74 | 73 | assert !ints.contains(obj); // 编译报错 |
75 | 74 | assert !ints.containsAll(objs); // 编译报错 |
76 | 75 | ``` |
77 | | -- 最后两个测试是非法的,因为类型声明要求我们只能测试一个列表是否包含该列表的一个子类型的元素。 |
78 | | -所以我们可以检查一个对象列表是否包含整数列表,而不是相反。 |
79 | 76 |
|
80 | | -- 两种风格中哪一种更好是味道的问题。第一个允许更多的测试,第二个在编译时捕获更多的错误 |
81 | | -(同时排除一些明显的测试)。 `Java`库的设计者选择了第一种更自由的替代方案, |
82 | | -因为在泛型之前使用集合框架的人可能已经编写了诸如`ints.containsAll(objs)`之类的测试, |
83 | | -并且该人希望该测试在泛型之后保持有效被添加到`Java`。但是,在设计新的通用库 |
84 | | -(如`MyCollection`)时,如果向后兼容性不太重要,那么在编译时捕获更多错误的设计可能更有意义。 |
| 77 | +最后两个测试是非法的,因为类型声明要求我们只能测试一个列表是否包含该列表的一个子类型的元素。所以我们可以检查一个对象列表是否包含整数列表,而不是相 |
| 78 | +反。 |
85 | 79 |
|
86 | | -- 可以说,核心包设计师做出了错误的选择。很少需要像`ints.containsAll(objs)`这样的测试, |
87 | | -而且这样的测试仍然可以通过声明`int`具有`List<Object>`类型而不是`List<Integer>`类型来允许。 |
88 | | -在普通情况下捕捉更多的错误可能会更好,而不是允许在一个不常见的情况下进行更精确的打字。 |
| 80 | +两种风格中哪一种更好是味道的问题。第一个允许更多的测试,第二个在编译时捕获更多的错误(同时排除一些明显的测试)。 `Java` 库的设计者选择了第一种更自由 |
| 81 | +的替代方案,因为在泛型之前使用集合框架的人可能已经编写了诸如 `ints.containsAll(objs)` 之类的测试,并且该人希望该测试在泛型之后保持有效被添加到 |
| 82 | +`Java`。但是,在设计新的通用库(如 `MyCollection` )时,如果向后兼容性不太重要,那么在编译时捕获更多错误的设计可能更有意义。 |
89 | 83 |
|
90 | | -- 同样的设计选择适用于包含`Object`或`Collection<?>`的其他方法。 |
91 | | - 在他们的签名中,如`remove`,`removeAll`和`retainAll`。 |
92 | | - |
93 | | - |
94 | | - |
95 | | - |
96 | | - |
97 | | - |
98 | | - |
99 | | - |
| 84 | +可以说,核心包设计师做出了错误的选择。很少需要像 `ints.containsAll(objs)` 这样的测试,而且这样的测试仍然可以通过声明 `int` 具有 `List<Object>` 类 |
| 85 | +型而不是 `List<Integer>` 类型来允许。在普通情况下捕捉更多的错误可能会更好,而不是允许在一个不常见的情况下进行更精确的打字。 |
| 86 | + |
| 87 | +同样的设计选择适用于包含 `Object` 或 `Collection<?>` 的其他方法。在他们的签名中,如 `remove`,`removeAll` 和 `retainAll`。 |
100 | 88 |
|
101 | | -《《《 [上一节](06_Wildcards_Versus_Type_Parameters.md) <br/> |
102 | | -《《《 [返回首页](../README.md) |
| 89 | +《《《 [下一节](07_Wildcard_Capture.md) <br/> |
| 90 | +《《《 [返回首页](../README.md) |
0 commit comments