第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么這個(gè)通用java代碼不會(huì)編譯?

為什么這個(gè)通用java代碼不會(huì)編譯?

慕運(yùn)維8079593 2019-08-13 17:26:42
為什么這個(gè)通用java代碼不會(huì)編譯?在這個(gè)簡化的例子中,我有一個(gè)泛型類,以及一個(gè)返回Map而不管類型參數(shù)的方法。當(dāng)我沒有在包含類上指定類型時(shí),為什么編譯器會(huì)清除地圖上的類型?import java.util.Map;public class MyClass<T>{     public Map<String, String> getMap()     {            return null;     }     public void test()     {            MyClass<Object> success = new MyClass<Object>();         String s = success.getMap().get("");         MyClass unchecked = new MyClass();         Map<String, String> map = unchecked.getMap();  // Unchecked warning, why?         String s2 = map.get("");         MyClass fail = new MyClass();         String s3 = fail.getMap().get("");  // Compiler error, why?     }}我得到這個(gè)編譯錯(cuò)誤。MyClass.java:20: incompatible types found   : java.lang.Objectrequired: java.lang.String                 String s3 = fail.getMap().get("");  // Compiler error
查看完整描述

3 回答

?
慕的地6264312

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("");


查看完整回答
反對(duì) 回復(fù) 2019-08-13
?
慕斯709654

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊

嗯...不幸的是我無法告訴你它失敗的原因。但我可以給你一個(gè)簡單的解決方法:

改變的類型failMyClass<?>,那么它將編譯就好了。


查看完整回答
反對(duì) 回復(fù) 2019-08-13
  • 3 回答
  • 0 關(guān)注
  • 675 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)