簡體   English   中英

關於使用通配符 generics 投射對象的概念問題

[英]Conceptual question about casting objects using wildcard generics

我試圖理解為什么編譯器處理對象(使用通配符泛型)被內聯聲明的方式與首先設置為變量的對象不同。

請參見以下示例:

public class SillyTest{

    interface A<T extends B> {}
    interface B {}

    @Test
    public void m() {

        Class<?> b1 = A.class.getClass();
        Class<? extends B> bb1 = (Class<? extends B>) b1; // works fine

        Class<? extends B> bb2 = (Class<? extends B>) A.class.getClass(); // doesn't compile
        Class<? extends B> bb3 = (Class<? extends B>)(A.class.getClass()); // also doesn't compile
    }
}

注意:根據您的編譯器配置,您可能必須添加@SuppressWarnings("unchecked")注釋。

為什么編譯器處理這兩種情況不同? 我希望由於編譯器內聯這些調用無論如何都應該是等效的。 除了這是一個未經檢查的強制轉換(可能有效也可能無效)這一事實之外, getClass()返回一個Class<?> ,所以我看不出為什么應該以不同方式處理它。

由於 A 沒有擴展 B,因此您的最后兩條語句顯然是錯誤的,這可以在編譯時確定。 另一方面, b1的類型是Class<?> ,因此在編譯時不知道它是否擴展了 B 。 需要進行運行時檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM