4 回答

TA貢獻1752條經驗 獲得超4個贊
先想想你要怎么使用這個方法,我想應該是這樣:
AType a = Singleton.getSingleInstance();
問題來了,上面的getSingleInstance如何知道應該返回什么類型呢?所以這種用法是不允許的。
反過來,如果singleInstance和getSingleInstance不是靜態的,而是實例變量和方法的話就沒問題,因為這時候需要返回何種類型是明確的:
Singleton<AType> s = new Singleton<AType>();
AType a = s.getSingleInstance();

TA貢獻1936條經驗 獲得超7個贊

TA貢獻1772條經驗 獲得超6個贊
類型擦除后,泛型類型會被替換成具體類,一般是Object,所以假如不考慮錯誤,你的類擦除后就是
public class Singleton
{
private static Object singleInstance
private static Object getSingleInstance()
{
if(singleInstance == null)
return singleInstance;
}
}
調用時的語句
AType a = Singleton.getSingleInstance();
相當于Object對象賦值給a,這是不允許的,需要強制轉換
這里就跟 “代碼宇宙” 說的一樣了,getSingleInstance不知道應該返回什么類型,只有運行時才能確認,所以這種寫法是有問題的。

TA貢獻1810條經驗 獲得超5個贊
因為所有泛型類最終映射到同一個原始類型類,而靜態屬性是類級別的,類和實例共同擁有它的一份存儲,因此一份存儲無法安放多個類型的屬性。靜態方法也是如此。
具體參看Java泛型: 類型擦除(type erasure)
添加回答
舉報