名称冲突:test2 类型的方法 add(Object) 与 HashSet 类型的 add(E) 具有相同的擦除功能,但不会覆盖它

2024-04-17

导入 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) 具有相同的擦除功能,但不会覆盖它

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


这里起作用的概念称为类型擦除 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html. HashSet定义一个方法add(T),然后你定义一个方法add(Object)。乍一看,人们可能会认为这还可以;但实际上,这并没有什么问题。你的方法只是重载add。然而,擦除T is Object因此两者具有相同的已擦除签名。

现在,如果您的方法正确地覆盖了来自HashSet。但要做到这一点,你应该使用add(Integer)并不是add(Object)。您没有正确重写父方法,因此会报告为冲突,因为类无法提供具有相同签名的两个方法。

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

进一步阅读

Angelika Langer 仿制药常见问题解答

  • 方法何时覆盖其超类型的方法? http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ813
  • 非泛型子类型的方法可以覆盖泛型超类型的方法吗? http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#Can%20a%20method%20of%20a%20non-generic%20subtype%20override%20a%20method%20of%20a%20generic%20supertype?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

名称冲突:test2 类型的方法 add(Object) 与 HashSet 类型的 add(E) 具有相同的擦除功能,但不会覆盖它 的相关文章

随机推荐