方法簽名重複和泛型擦除
在Java 中,不允許在同一個類別中聲明具有相同擦除的兩個方法在對其泛型類型套用類型擦除之後。此限制是由於與使用原始類型的遺留程式碼可能發生衝突而產生的。
考慮以下範例:
class Test { void add(Set<Integer> ii) {} void add(Set<String> ss) {} }
此程式碼將觸發編譯錯誤:「Method add(Set)與Test 類型中的另一個方法具有相同的擦除add(Set)。 」
為了理解此限制背後的基本原理,讓我們追蹤一個假設的程式碼庫:
最初,在Java在中引入泛型之前,可能編寫了以下程式碼:
class CollectionConverter { List toList(Collection c) {...} }
隨後,創建了此類的擴充:
class Overrider extends CollectionConverter { List toList(Collection c) {...} }
隨著泛型的引入,CollectionConverter 類別被更新:
class CollectionConverter { <T> List<T> toList(Collection<T> c) {...} }
但是,Overrider 類別保持不變。為了繼續正確地重寫 toList() 方法,我們決定原始類型與泛型類型「重寫等效」。
後來,Overrider 的開發人員嘗試更新該類,但在該類旁邊添加了一個新方法現有的原始toList() 方法:
class Overrider extends CollectionConverter { @Override List toList(Collection c) {...} @Override <T> List<T> toList(Collection<T> c) {...} }
由於原始類型的覆蓋等效性,這兩種方法都可能覆寫toList(Collection
為了防止此類衝突,Java 語言限制在單一類別中存在具有相同擦除的多個方法。這確保開發人員可以自信地重寫方法,而不會引入因使用原始類型的遺留程式碼而引起的歧義。
以上是為什麼 Java 在通用擦除後防止方法簽名重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!