Java中的捕获转换是什么,任何人都可以举个例子吗?
我注意到JLS谈论5.1.10捕获转换,但是我不明白它们是什么。
谁能向我解释/举一些例子?
回答:
捕获转换旨在使通配符(通用)?
有用。
假设我们有以下课程:
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部分),它明确指出:
捕获转换使编译器可以为捕获的通配符制造一个占位符类型名称,以便类型推断可以将其推断为该类型。
希望对您有帮助。
以上是 Java中的捕获转换是什么,任何人都可以举个例子吗? 的全部内容, 来源链接: utcz.com/qa/401327.html