Java中的捕获转换是什么,任何人都可以举个例子吗?

发布于 2021-01-30 23:00:12

我注意到JLS谈论5.1.10捕获转换,但是我不明白它们是什么。

谁能向我解释/举一些例子?

关注者
0
被浏览
135
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    捕获转换旨在使通配符(通用)?有用。

    假设我们有以下课程:

    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部分),它明确指出:

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

    希望对您有帮助。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看