java核心技术 卷1里面泛型一章中“泛型类的静态上下文中类型变量无效”这一节不能理解
ringa_lee
ringa_lee 2017-04-17 17:09:31
0
4
857

书里面这么写的:

public class Singleton<T>
{
    private static T singleInstance    //ERROR
    private static T getSingleInstance()    //ERROR
    {
        if(singleInstance == null)
            return singleInstance;
    }
}

类型擦除后,只剩下Singleton类,它只包含一个singleInstance域。因此,禁止使用带有类型变量的静态域和方法。

不太理解什么意思,为什么跟类型擦除有关系?请高手指点一下

ringa_lee
ringa_lee

ringa_lee

全部回覆(4)
阿神

先想想你要怎麼使用這個方法,我想應該是這樣:

AType a = Singleton.getSingleInstance();AType a = Singleton.getSingleInstance();

问题来了,上面的getSingleInstance如何知道应该返回什么类型呢?所以这种用法是不允许的。

反过来,如果singleInstancegetSingleInstance

問題來了,上面的getSingleInstance如何知道應該回傳什麼類型?所以這種用法是不允許的。 🎜 🎜反過來,如果singleInstancegetSingleInstance不是靜態的,而是實例變數和方法的話就沒問題,因為這時候需要回傳何種類型是明確的:🎜
Singleton<AType> s = new Singleton<AType>();
AType a = s.getSingleInstance();
大家讲道理

泛型只有類別物件才能使用, 透過來聲明和初始化, 不同的物件泛型參數不同, 而類別成員變數屬於所有物件, 因此不予許聲明泛型類別成員變數(我自己的一點想法,剛看完tij的這一部分)

小葫芦

類型擦除後,泛型類型會被替換成具體類,一般是Object,所以假如不考慮錯誤,你的類別擦除後就是

public class Singleton
{
    private static Object singleInstance
    private static Object getSingleInstance()
    {
        if(singleInstance == null)
            return singleInstance;
    }
}

呼叫時的語句

AType a = Singleton.getSingleInstance();

相當於Object物件賦值給a,這是不允許的,需要強制轉換

這裡就跟 「程式碼宇宙」 說的一樣了,getSingleInstance不知道應該回傳什麼類型,只有在執行時才能確認,所以這種寫法是有問題的。

小葫芦

因為所有泛型類最終映射到同一個原始類型類,而靜態屬性是類級別的,類和實例共同擁有它的一份存儲,因此一份存儲無法安放多個類型的屬性。靜態方法也是如此。

具體參考Java泛型: 類型擦除(type erasure)

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!