首頁 > Java > java教程 > 為什麼 Java 在通用擦除後防止方法簽名重複?

為什麼 Java 在通用擦除後防止方法簽名重複?

Linda Hamilton
發布: 2024-12-25 16:56:13
原創
893 人瀏覽過

Why Does Java Prevent Method Signature Duplication After Generic Erasure?

方法簽名重複和泛型擦除

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板