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 appliedxxx例如,其中有一个数字337)。

这是因为编译器尝试进行类型安全性检查,shout()但是由于接收到通配符,因此它不知道T代表什么,因此创建了一个占位符,称为 Capture

of

从这里开始(Java理论和实践:通用泛滥,第1部分),它明确指出:

捕获转换使编译器可以为捕获的通配符制造一个占位符类型名称,以便类型推断可以将其推断为该类型。

希望对您有帮助。

以上是 Java中的捕获转换是什么,任何人都可以举个例子吗? 的全部内容, 来源链接: utcz.com/qa/401327.html

回到顶部