Skip to content

Commit 95281ed

Browse files
authored
Update 07_Wildcard_Capture.md
1 parent 2f42a57 commit 95281ed

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

ch02/07_Wildcard_Capture.md

+16-16
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ public static <T> void reverse(List<T> list) {
2626
这会将参数复制到临时列表中,然后以相反的顺序将副本写回到原始文件中。如果您尝试使用类似方法体的第一个签名,它将不起作用:
2727

2828
```java
29-
public static void reverse(List<?> list) {
30-
List<Object> tmp = new ArrayList<Object>(list);
31-
for (int i = 0; i < list.size(); i++) {
32-
list.set(i, tmp.get(list.size() - i - 1)); // 编译报错
33-
}
29+
public static void reverse(List<?> list) {
30+
List<Object> tmp = new ArrayList<Object>(list);
31+
for (int i = 0; i < list.size(); i++) {
32+
list.set(i, tmp.get(list.size() - i - 1)); // 编译报错
3433
}
34+
}
3535
```
3636

3737
现在从拷贝写入原始文件是不合法的,因为我们试图从对象列表写入未知类型的列表。 用 `List<?>` 替换 `List<Object>` 不会解决问题,因为现在我们有两个带有
@@ -40,25 +40,25 @@ public static <T> void reverse(List<T> list) {
4040
相反,您可以通过使用第二个签名实现私有方法并从第一个签名调用第二个签名来实现具有第一个签名的方法:
4141

4242
```java
43-
public static void reverse(List<?> list) { rev(list); }
44-
private static <T> void rev(List<T> list) {
45-
List<T> tmp = new ArrayList<T>(list);
46-
for (int i = 0; i < list.size(); i++) {
47-
list.set(i, tmp.get(list.size() - i - 1));
48-
}
43+
public static void reverse(List<?> list) { rev(list); }
44+
private static <T> void rev(List<T> list) {
45+
List<T> tmp = new ArrayList<T>(list);
46+
for (int i = 0; i < list.size(); i++) {
47+
list.set(i, tmp.get(list.size() - i - 1));
4948
}
49+
}
5050
```
5151

5252
在这里我们说类型变量 `T` 已经捕获了通配符。 这是处理通配符时通常有用的技巧,值得了解。
5353

5454
了解通配符捕获的另一个原因是,即使您不使用上述技术,它也可以显示在错误消息中。通常,每次出现通配符都表示某种未知类型。 如果编译器打印包含此类型的错误
55-
消息,则称为捕获。 例如,使用 `Sun` 当前的编译器,反向版本不正确会生成以下错误消息:
55+
消息,则称为捕获 `?`。 例如,使用 `Sun` 当前的编译器,反向版本不正确会生成以下错误消息:
5656

5757
```java
58-
Capture.java:6: set(int,capture of ?) in java.util.List<capture of ?>
59-
cannot be applied to (int,java.lang.Object)
60-
list.set(i, tmp.get(list.size() - i - 1));
61-
^
58+
Capture.java:6: set(int,capture of ?) in java.util.List<capture of ?>
59+
cannot be applied to (int,java.lang.Object)
60+
list.set(i, tmp.get(list.size() - i - 1));
61+
^
6262
```
6363

6464
因此,如果你看到这个奇怪的短语 ` capture of ?` 在错误消息中,它将来自通配符类型。 即使有两个不同的通配符,编译器也会打印与每个相关的类型作为

0 commit comments

Comments
 (0)