捕获转换旨在使通配符(通用)
?有用。
假设我们有以下课程:
public interface Test<T> { public void shout(T whatever); public T repeatPreviousShout();}在我们代码的某个地方,
public static void instantTest(Test<?> test) { System.out.println(test.repeatPreviousShout());}因为
test不是原始值,
Test并且因为
repeatPreviousShout()在“ hindsight”中返回a
?,所以编译器知道有一个
T充当的类型参数
Test。这
T是针对未知的,
T因此编译器会擦除未知类型(对于通配符,它将替换为
Object),因此
repeatPreviousShout()返回
Object。
但是如果有的话
public static void instantTest2(Test<?> test) { test.shout(test.repeatPreviousShout());}编译器会给我们类似的错误
Test<capture#xxx of ?> cannot be applied(
xxx例如,其中有一个数字
337)。
这是因为编译器尝试进行类型安全性检查,
shout()但是由于接收到通配符,因此它不知道
T代表什么,因此创建了一个占位符,称为 Capture
of 。
从这里开始(Java理论和实践:通用泛滥,第1部分),它明确指出:
捕获转换使编译器可以为捕获的通配符制造一个占位符类型名称,以便类型推断可以将其推断为该类型。
希望对您有帮助。



