2008-12-16 50 views
9

在一堆Ø在我的代碼」的地方,我有這樣的事情:用Class <?替換Class是否是好習慣?擴展對象>以避免警告?

public Class mySpecialMethod() { 
    return MySpecialClass.class; 
} 

這將導致警告

類是原始類型。參考 泛型類應爲 參數化。

但是,如果我更換

Class

Class<? extends Object>

警告消失。

這是簡單的做法還是可以的,或者以後會引起麻煩嗎?

回答

15

只有在沒有類對象需要表示的公共基類或接口時纔會這樣做。

另外Class<?>實際上與Class<? extends Object>相同。

6

取決於你想要達到的目標,你可以更精確:

public Class<MySpecialClass> mySpecialMethod() { 
    return MySpecialClass.class; 
} 
4

不是一個真正的Java程序員在這裏,但瞭解一些仿製藥好論文。

是的,你應該添加一些通配符或確切類型(Class<MySpecialClass>)來增加安全性。原因是類是通用的。因此,Class<Bar>Class<Foo>在刪除它們的泛型類型參數後是相同的。它們全部變成Class,即所謂的原始類型。編譯時會發生擦除。一些例子來說明這個地方的編譯器可以幫助你自動鑄造(略去了異常處理):

class Mine { } 

class Vara { 
    public static void main(String... args) { 
     { // works. translated to Mine m = (Mine) c.newInstance(); 
      Class<Mine> c = Mine.class; 
      Mine m = c.newInstance(); 
     } 
     { // doesn't work. need a cast: Mine m = (Mine) c.newInstance(); 
      Class c = Mine.class; // also Class<?> or Class<? extends Object> 
      Object o = c.newInstance(); // but this works. pointing to a Mine 
      Mine m = (Mine) c.newInstance(); // needs a manual cast 
     } 
    } 
} 

Class<?>(和等效Class<? extends Object>),你就告訴你真正想要的編譯器一類,其T是Object ,並沒有意外地使用原始類型。但它不會添加任何便利演員。所有這些泛型都會爲你插入自動施放,將其從Object轉換爲目標類型。由於兼容性原因與較舊的Java版本不同,泛型在運行時與U類型或T類型一樣。

相關問題