书里面这么写的:
public class Singleton<T>
{
private static T singleInstance //ERROR
private static T getSingleInstance() //ERROR
{
if(singleInstance == null)
return singleInstance;
}
}
类型擦除后,只剩下Singleton类,它只包含一个singleInstance域。因此,禁止使用带有类型变量的静态域和方法。
不太理解什么意思,为什么跟类型擦除有关系?请高手指点一下
先想想你要怎麼使用這個方法,我想應該是這樣:
AType a = Singleton.getSingleInstance();
AType a = Singleton.getSingleInstance();
问题来了,上面的
getSingleInstance
如何知道应该返回什么类型呢?所以这种用法是不允许的。反过来,如果
問題來了,上面的singleInstance
和getSingleInstance
getSingleInstance
如何知道應該回傳什麼類型?所以這種用法是不允許的。 🎜 🎜反過來,如果singleInstance
和getSingleInstance
不是靜態的,而是實例變數和方法的話就沒問題,因為這時候需要回傳何種類型是明確的:🎜泛型只有類別物件才能使用, 透過來聲明和初始化, 不同的物件泛型參數不同, 而類別成員變數屬於所有物件, 因此不予許聲明泛型類別成員變數(我自己的一點想法,剛看完tij的這一部分)
類型擦除後,泛型類型會被替換成具體類,一般是Object,所以假如不考慮錯誤,你的類別擦除後就是
呼叫時的語句
相當於Object物件賦值給a,這是不允許的,需要強制轉換
這裡就跟 「程式碼宇宙」 說的一樣了,getSingleInstance不知道應該回傳什麼類型,只有在執行時才能確認,所以這種寫法是有問題的。
因為所有泛型類最終映射到同一個原始類型類,而靜態屬性是類級別的,類和實例共同擁有它的一份存儲,因此一份存儲無法安放多個類型的屬性。靜態方法也是如此。
具體參考Java泛型: 類型擦除(type erasure)