我正在查看GWT的一些GXT代碼,并且遇到了泛型的這種用法,我在Java教程中找不到另一個示例。類名稱是com.extjs.gxt.ui.client.data.BaseModelData您是否要查看所有代碼。以下是重要部分:private RpcMap map;public <X> X get(String property) { if (allowNestedValues && NestedModelUtil.isNestedProperty(property)) { return (X)NestedModelUtil.getNestedValue(this, property); } return map == null ? null : (X) map.get(property);}X在類中的其他地方或?qū)哟谓Y(jié)構(gòu)中的任何地方都沒有定義,并且當我在eclipse中單擊“轉(zhuǎn)到聲明”時,它只轉(zhuǎn)到<X>公共方法簽名中。我嘗試通過以下兩個示例調(diào)用此方法,以了解發(fā)生了什么:public Date getExpiredate() { return get("expiredate");}public String getSubject() { return get("subject");}它們編譯并且不顯示任何錯誤或警告。我認為至少我必須進行轉(zhuǎn)換才能使其正常工作。這是否意味著泛型允許一個魔術(shù)返回值,該返回值可以是任何值,并且只會在運行時爆炸?這似乎與仿制藥應該做的相反。誰能給我解釋一下,并且可能給我鏈接一些說明得更好的文檔?我瀏覽了Sun的23頁關(guān)于泛型的pdf文件,每個返回值的示例都在類級別定義或在傳入的參數(shù)之一中定義。
3 回答

郎朗坤
TA貢獻1921條經(jīng)驗 獲得超9個贊
該方法返回您所期望的類型(<X>在方法中定義并且絕對不受限制)。
這非常非常危險,因為沒有規(guī)定返回類型實際上與返回值匹配。
這樣做的唯一好處是,您不必強制轉(zhuǎn)換可以返回任何類型的此類通用查找方法的返回值。
我會說:謹慎使用此類構(gòu)造,因為您幾乎失去了所有類型安全,而獲得的好處是,不必在每次調(diào)用時都編寫顯式強制轉(zhuǎn)換get()。
是的:這幾乎是黑魔法,在運行時會炸毀,打破了泛型應該實現(xiàn)的整個想法。

幕布斯6054654
TA貢獻1876條經(jīng)驗 獲得超7個贊
類型在方法上聲明。這就是“ <X>”的意思。然后將類型的范圍限定為僅方法,并且與特定的調(diào)用相關(guān)。您的測試代碼編譯的原因是,編譯器會嘗試確定類型,并且只會在無法確定類型時進行投訴。在某些情況下,您必須明確。
例如,對于該聲明Collections.emptySet()是
public static final <T> Set<T> emptySet()
在這種情況下,編譯器可以猜測:
Set<String> s = Collections.emptySet();
但是,如果不能,則必須鍵入:
Collections.<String>emptySet();
添加回答
舉報
0/150
提交
取消