[英]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.