Skip to content

Commit 61dddb6

Browse files
authored
Update 06_Wildcards_Versus_Type_Parameters.md
1 parent a3f7d6f commit 61dddb6

File tree

1 file changed

+31
-43
lines changed

1 file changed

+31
-43
lines changed
Lines changed: 31 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
《《《 [返回首页](../README.md) <br/>
22
《《《 [上一节](05_Arrays.md)
33

4-
## 通配符与类型参数
4+
### 通配符与类型参数
55

6-
- `contains`方法检查集合是否包含给定的对象,并且其泛化`containsAll`检查集合是否包含另一个集合的每个元素。
7-
本部分介绍了为这些方法提供通用签名的两种替代方法。 第一种方法使用通配符,是`Java`集合框架中使用的通配符。
8-
第二种方法使用类型参数,通常是更合适的选择。
6+
`contains` 方法检查集合是否包含给定的对象,并且其泛化 `containsAll` 检查集合是否包含另一个集合的每个元素。 本部分介绍了为这些方法提供通用签名的两种
7+
替代方法。 第一种方法使用通配符,是 `Java` 集合框架中使用的通配符。 第二种方法使用类型参数,通常是更合适的选择。
98

10-
- 通配符: 以下是`Java`中泛型方法的类型:
9+
通配符: 以下是 `Java` 中泛型方法的类型:
1110

1211
```java
1312
interface Collection<E> {
@@ -16,16 +15,17 @@
1615
public boolean containsAll(Collection<?> c);
1716
...
1817
}
19-
```
20-
- 第一种方法根本不使用泛型! 第二种方法是我们第一次看到一个重要的缩写。
21-
类型`Collection <?>`代表:
18+
```
19+
20+
第一种方法根本不使用泛型! 第二种方法是我们第一次看到一个重要的缩写。 类型 `Collection <?>` 代表:
2221

2322
```java
2423
Collection<? extends Object>
2524
```
26-
- 扩展对象是通配符最常用的用法之一,所以提供一个简短的表单来编写它是有意义的.
25+
26+
扩展对象是通配符最常用的用法之一,所以提供一个简短的表单来编写它是有意义的.
2727

28-
- 这些方法让我们测试成员和遏制:
28+
这些方法让我们测试成员和遏制:
2929

3030
```java
3131
Object obj = "one";
@@ -36,11 +36,11 @@
3636
assert !ints.contains(obj);
3737
assert !ints.containsAll(objs);
3838
```
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+
样的测试可能会成功
4444

4545
```java
4646
Object obj = 1;
@@ -49,10 +49,9 @@
4949
assert ints.contains(obj);
5050
assert ints.containsAll(objs);
5151
```
52-
- 在这种情况下,对象可能被包含在整数列表中,因为它碰巧是一个整数,并且对象列表可能包含在整数列表中,
53-
因为列表中的每个对象碰巧是一个整数。
54-
- 类型参数你可以合理地选择一个替代设计的集合
55-
- 只能测试元素类型的子类型的容器的设计:
52+
53+
在这种情况下,对象可能被包含在整数列表中,因为它碰巧是一个整数,并且对象列表可能包含在整数列表中,因为列表中的每个对象碰巧是一个整数。 - 类型参数你
54+
可以合理地选择一个替代设计的集合- 只能测试元素类型的子类型的容器的设计:
5655

5756
```java
5857
interface MyCollection<E> { // alternative design
@@ -62,8 +61,8 @@
6261
...
6362
}
6463
```
65-
- 假设我们有一个实现`MyCollection``MyList`类。 现在这些测试是合法的,
66-
只有一个方法:
64+
65+
假设我们有一个实现 `MyCollection``MyList` 类。 现在这些测试是合法的,只有一个方法:
6766

6867
```java
6968
Object obj = "one";
@@ -74,29 +73,18 @@
7473
assert !ints.contains(obj); // 编译报错
7574
assert !ints.containsAll(objs); // 编译报错
7675
```
77-
- 最后两个测试是非法的,因为类型声明要求我们只能测试一个列表是否包含该列表的一个子类型的元素。
78-
所以我们可以检查一个对象列表是否包含整数列表,而不是相反。
7976

80-
- 两种风格中哪一种更好是味道的问题。第一个允许更多的测试,第二个在编译时捕获更多的错误
81-
(同时排除一些明显的测试)。 `Java`库的设计者选择了第一种更自由的替代方案,
82-
因为在泛型之前使用集合框架的人可能已经编写了诸如`ints.containsAll(objs)`之类的测试,
83-
并且该人希望该测试在泛型之后保持有效被添加到`Java`。但是,在设计新的通用库
84-
(如`MyCollection`)时,如果向后兼容性不太重要,那么在编译时捕获更多错误的设计可能更有意义。
77+
最后两个测试是非法的,因为类型声明要求我们只能测试一个列表是否包含该列表的一个子类型的元素。所以我们可以检查一个对象列表是否包含整数列表,而不是相
78+
反。
8579

86-
- 可以说,核心包设计师做出了错误的选择。很少需要像`ints.containsAll(objs)`这样的测试,
87-
而且这样的测试仍然可以通过声明`int`具有`List<Object>`类型而不是`List<Integer>`类型来允许。
88-
在普通情况下捕捉更多的错误可能会更好,而不是允许在一个不常见的情况下进行更精确的打字
80+
两种风格中哪一种更好是味道的问题。第一个允许更多的测试,第二个在编译时捕获更多的错误(同时排除一些明显的测试)。 `Java` 库的设计者选择了第一种更自由
81+
的替代方案,因为在泛型之前使用集合框架的人可能已经编写了诸如 `ints.containsAll(objs)` 之类的测试,并且该人希望该测试在泛型之后保持有效被添加到
82+
`Java`。但是,在设计新的通用库(如 `MyCollection` )时,如果向后兼容性不太重要,那么在编译时捕获更多错误的设计可能更有意义
8983

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`
10088

101-
《《《 [上一节](06_Wildcards_Versus_Type_Parameters.md) <br/>
102-
《《《 [返回首页](../README.md)
89+
《《《 [下一节](07_Wildcard_Capture.md) <br/>
90+
《《《 [返回首页](../README.md)

0 commit comments

Comments
 (0)