java - 名称冲突 : The method add(Object) of type test2 has the same erasure as add(E) of type HashSet<E> but does not override it

标签 java generics

导入 java.util.*;

  class A extends HashSet<Integer> {
       public boolean add(Object obj){  //compiler error
        return true;
       }
    }
    or
   class Abc <T> {
    public void add(T t){}  //compiler error
    public void add(Object i){} //compiler error (can't overload?)
    }

错误:名称冲突:test2 类型的方法 add(Object) 与 HashSet 类型的 add(E) 具有相同的删除,但没有覆盖它

我不知道上述错误背后的概念是什么,有人可以建议我在哪里可以研究这个概念吗?

最佳答案

这里工作的概念叫做type erasure . HashSet定义了一个方法add(T),你定义了一个方法add(Object)。乍一看,可能会认为这没问题;您的方法只是重载了 add。但是,T的删除是Object,因此两者具有相同的删除签名。

现在,如果您的方法正确地覆盖了 HashSet 中的方法,那就没问题了。但要这样做,您应该使用 add(Integer) 而不是 add(Object)。您没有正确覆盖父方法,而是将其报告为冲突,因为一个类不能提供两个具有相同签名的方法。

您的 Abc 示例遵循相同的推理。您声明的两个方法具有相同的删除签名,因此它们会发生冲突。

延伸阅读

Angelika Langer 泛型常见问题解答

关于java - 名称冲突 : The method add(Object) of type test2 has the same erasure as add(E) of type HashSet<E> but does not override it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768028/

相关文章:

java - java中删除带空格重复字母的正则表达式

Java 泛型——这两个方法声明是否等价?

java - 编程时如何使用Calc(或Excel)减少重复的代码编辑?

c# - 在 Dictionary<T1,someEnum> 和 Dictionary<T3,someEnum> 之间转换,其中 T1 :T3 Throws an Error

java - 带有类型参数的 Guice 模块

java - 用泛型类包装非泛型类的正确方法

java - 泛型与泛型数组列表?

java - 跟踪增强型 Android 应用程序的标记。哪个图书馆?

java - Android 从文本文件中获取图像路径

java - 根据 Id 处理子线程