1 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
關(guān)于向后兼容性的爭(zhēng)論仍然成立。
如果您有這段代碼(不使用泛型,強(qiáng)烈建議不要使用,但即使在今天也是合法的,并且在應(yīng)該仍然可以編譯的 Java 1.4 代碼中完全正常),編譯器應(yīng)該選擇您的兩種方法中的哪一種?
List rawList = new ArrayList(); YourClass.f(rawList);
更重要的是,假設(shè)您以某種方式選擇兩者之一,在生成的調(diào)用站點(diǎn)字節(jié)碼中,泛型仍然會(huì)被刪除,因此在運(yùn)行時(shí),JVM 不知道您指的是兩者中的哪一個(gè)f(List)
。方法調(diào)用指定方法名稱(chēng)和簽名,但該簽名不包括泛型。這并不是出于兼容性問(wèn)題。他們是否可以嘗試使用帶有擴(kuò)展調(diào)用規(guī)范的新操作碼之類(lèi)的東西來(lái)更努力地推動(dòng)這一點(diǎn)?或許。但現(xiàn)在就是這樣。
另一方面,最好的答案通常引用 JLS 8.4.2 并解釋說(shuō),為了與舊的、預(yù)通用的 Java 版本(以及較新版本中的原始類(lèi)型)兼容,禁止使用具有覆蓋等效簽名的方法。
我同意后一個(gè)論點(diǎn),但它只意味著實(shí)例方法(非靜態(tài)),因?yàn)殪o態(tài)方法無(wú)論如何都不能被覆蓋。
好吧,您不能覆蓋靜態(tài)方法,但是您的兩個(gè)方法仍然是“覆蓋等效的”,這意味著它們的簽名非常接近,以至于您一次只能擁有其中一個(gè)(在子類(lèi)情況下,一個(gè)如果因此而繼承,則會(huì)覆蓋另一個(gè)方法 --- 但這也意味著您不能在同一個(gè)類(lèi)上擁有兩個(gè)這樣的方法)。
請(qǐng)注意,這不會(huì)造成任何實(shí)際問(wèn)題,因?yàn)槟冀K可以通過(guò)更改為不同的方法名稱(chēng)來(lái)避免“重載”。
添加回答
舉報(bào)