我試圖理解為什么編譯器對待行內宣告的物件(使用通配符泛型)與首先設定為變數的物件不同。
請參閱以下示例:
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<?>,所以我看不出應該以不同方式處理的原因。
uj5u.com熱心網友回復:
由于Class<A>不擴展B,您的最后兩個陳述句顯然是錯誤的,并且可以在編譯時確定。b1另一方面,是型別Class<?>,所以在編譯時不知道是否?擴展 B 。需要進行運行時檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384267.html
