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

Ashish Sharma:

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

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

马克·彼得斯:

这里工作的概念称为类型擦除HashSet定义方法add(T),然后定义方法add(Object)乍一看,可能会觉得不错。您的方法只是重载add但是,由于擦除Tis Object,因此两者具有相同的已擦除签名。

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

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

进一步阅读

Angelika Langer泛型常见问题解答

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章