我注意到 JLS 谈到5.1.10 捕捉转换 http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.10,但我不明白它们是什么。
谁能给我解释一下/举个例子吗?
捕获转换旨在制作通配符(在泛型中),?
useful.
假设我们有以下类:
public interface Test<T> {
public void shout(T whatever);
public T repeatPreviousShout();
}
在我们的代码中的某个地方,
public static void instantTest(Test<?> test) {
System.out.println(test.repeatPreviousShout());
}
Because test
不是原始的Test
自从repeatPreviousShout()
在“事后看来”返回一个?
,编译器知道有一个T
用作类型参数Test
.
This T
是为了一些未知的T
所以编译器会删除未知类型(对于通配符,它替换为Object
)。, 因此repeatPreviousShout()
返回一个Object
.
但如果我们有,
public static void instantTest2(Test<?> test) {
test.shout(test.repeatPreviousShout());
}
编译器会给我们一个类似的错误Test<capture#xxx of ?> cannot be applied
(where xxx
是一个数字,例如337
).
这是因为编译器尝试进行类型安全检查shout()
但由于它收到了通配符,所以它不知道是什么T
代表,因此它创建一个名为的占位符捕获.
From 这里(Java 理论与实践:疯狂使用泛型,第 1 部分) http://www.ibm.com/developerworks/java/library/j-jtp04298.html,它明确指出:
捕获转换允许
编译器生成占位符
输入捕获的通配符的名称,
这样类型推断就可以推断出
是那种类型。
希望这对您有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)