3 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
得到它了。這實(shí)際上不是一個(gè)錯(cuò)誤,看起來很奇怪。
從JLS的4.8節(jié)(原始類型):
未從其超類或超接口繼承的原始類型C的構(gòu)造函數(shù)(第8.8節(jié)),實(shí)例方法(第8.8節(jié),第9.4節(jié))或非靜態(tài)字段(第8.3節(jié))M的類型是其類型的擦除在對(duì)應(yīng)于C的泛型聲明中。原始類型C的靜態(tài)成員的類型與對(duì)應(yīng)于C的泛型聲明中的類型相同。
因此,即使方法的類型簽名不使用類本身的任何類型參數(shù),類型擦除也會(huì)啟動(dòng)并且簽名變得有效
public Map getMap()
換句話說,我想你能想象一個(gè)原始類型為相同的API泛型類型,但所有<X>的移除位隨處可見(在API中,未實(shí)現(xiàn))。
編輯:此代碼:
MyClass unchecked = new MyClass();
Map<String, String> map = unchecked.getMap(); // Unchecked warning, why?
String s2 = map.get("");
編譯,因?yàn)閺脑糓ap類型到隱式但未經(jīng)檢查的轉(zhuǎn)換Map<String, String>。通過在最后一種情況下進(jìn)行顯式轉(zhuǎn)換(在執(zhí)行時(shí)無效),您可以獲得相同的效果:
// Compiles, but with an unchecked warning
String x = ((Map<String, String>)fail.getMap()).get("");

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
嗯...不幸的是我無法告訴你它失敗的原因。但我可以給你一個(gè)簡單的解決方法:
改變的類型fail
來MyClass<?>
,那么它將編譯就好了。
添加回答
舉報(bào)