@@ -26,12 +26,12 @@ public static <T> void reverse(List<T> list) {
26
26
这会将参数复制到临时列表中,然后以相反的顺序将副本写回到原始文件中。如果您尝试使用类似方法体的第一个签名,它将不起作用:
27
27
28
28
``` 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 )); // 编译报错
34
33
}
34
+ }
35
35
```
36
36
37
37
现在从拷贝写入原始文件是不合法的,因为我们试图从对象列表写入未知类型的列表。 用 ` List<?> ` 替换 ` List<Object> ` 不会解决问题,因为现在我们有两个带有
@@ -40,25 +40,25 @@ public static <T> void reverse(List<T> list) {
40
40
相反,您可以通过使用第二个签名实现私有方法并从第一个签名调用第二个签名来实现具有第一个签名的方法:
41
41
42
42
``` 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 ));
49
48
}
49
+ }
50
50
```
51
51
52
52
在这里我们说类型变量 ` T ` 已经捕获了通配符。 这是处理通配符时通常有用的技巧,值得了解。
53
53
54
54
了解通配符捕获的另一个原因是,即使您不使用上述技术,它也可以显示在错误消息中。通常,每次出现通配符都表示某种未知类型。 如果编译器打印包含此类型的错误
55
- 消息,则称为捕获? 。 例如,使用 ` Sun ` 当前的编译器,反向版本不正确会生成以下错误消息:
55
+ 消息,则称为捕获 ` ? ` 。 例如,使用 ` Sun ` 当前的编译器,反向版本不正确会生成以下错误消息:
56
56
57
57
``` 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
+ ^
62
62
```
63
63
64
64
因此,如果你看到这个奇怪的短语 ` capture of ? ` 在错误消息中,它将来自通配符类型。 即使有两个不同的通配符,编译器也会打印与每个相关的类型作为
0 commit comments