方法签名重复和泛型擦除
在 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中文网其他相关文章!