在一堆Ø在我的代碼」的地方,我有這樣的事情:用Class <?替換Class是否是好習慣?擴展對象>以避免警告?
public Class mySpecialMethod() {
return MySpecialClass.class;
}
這將導致警告
類是原始類型。參考 泛型類應爲 參數化。
但是,如果我更換
Class
與
Class<? extends Object>
警告消失。
這是簡單的做法還是可以的,或者以後會引起麻煩嗎?
在一堆Ø在我的代碼」的地方,我有這樣的事情:用Class <?替換Class是否是好習慣?擴展對象>以避免警告?
public Class mySpecialMethod() {
return MySpecialClass.class;
}
這將導致警告
類是原始類型。參考 泛型類應爲 參數化。
但是,如果我更換
Class
與
Class<? extends Object>
警告消失。
這是簡單的做法還是可以的,或者以後會引起麻煩嗎?
只有在沒有類對象需要表示的公共基類或接口時纔會這樣做。
另外Class<?>
實際上與Class<? extends Object>
相同。
取決於你想要達到的目標,你可以更精確:
public Class<MySpecialClass> mySpecialMethod() {
return MySpecialClass.class;
}
不是一個真正的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類型一樣。