亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java核心技術 卷1里面泛型一章中“泛型類的靜態上下文中類型變量無效”這一節不能理解

java核心技術 卷1里面泛型一章中“泛型類的靜態上下文中類型變量無效”這一節不能理解

江戶川亂折騰 2019-03-14 18:19:03
書里面這么寫的:public class Singleton<T>{    private static T singleInstance    //ERROR    private static T getSingleInstance()    //ERROR    {        if(singleInstance == null)            return singleInstance;    }}類型擦除后,只剩下Singleton類,它只包含一個singleInstance域。因此,禁止使用帶有類型變量的靜態域和方法。不太理解什么意思,為什么跟類型擦除有關系?請高手指點一下
查看完整描述

4 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

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


AType a = Singleton.getSingleInstance();


問題來了,上面的getSingleInstance如何知道應該返回什么類型呢?所以這種用法是不允許的。


反過來,如果singleInstance和getSingleInstance不是靜態的,而是實例變量和方法的話就沒問題,因為這時候需要返回何種類型是明確的:

Singleton<AType> s = new Singleton<AType>();

AType a = s.getSingleInstance();


查看完整回答
反對 回復 2019-04-17
?
LEATH

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

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


查看完整回答
反對 回復 2019-04-17
?
夢里花落0921

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不知道應該返回什么類型,只有運行時才能確認,所以這種寫法是有問題的。


查看完整回答
反對 回復 2019-04-17
?
森欄

TA貢獻1810條經驗 獲得超5個贊

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

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


查看完整回答
反對 回復 2019-04-17
  • 4 回答
  • 0 關注
  • 560 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號