【问题标题】:Overriding method覆盖方法
【发布时间】:2013-06-02 01:38:39
【问题描述】:

类 subA 是类 A 的子类。我试图重写一个方法,但不知何故它不允许我重写它。这是为什么?是因为参数中的参数吗?

错误信息读取:

名称冲突:subA 中的 add(E#1) 和 A 中的 add(E#2) 具有相同的擦除,但都不会覆盖另一个 其中 E#1,E#2 是类型变量:
E#1 扩展在 subA 类中声明的对象
E#2 扩展类 A 中声明的 Object

超类A:

public class A <E> {    

public void add(E toInsert) {...}

}

子类 subA:

public class subA <E> extends A {      

//overrides the method from A class
public void add (E toInsert)    <-- doesn't let me overrides    
{...}  

}

【问题讨论】:

  • public class subA&lt;E&gt; extends A&lt;E&gt;一样继承时需要给A提供类型参数
  • @TI:这看起来像是一个答案,而不是评论。
  • TI 的评论就是您需要知道的全部内容。但是,将来,您应该发布编译器报告的确切错误消息,而不是“它不允许我”。
  • @TI:请快点,因为我们得到了一堆糟糕的答案。
  • @HovercraftFullOfEels - TI 为时已晚。 Bohemian 搞砸了模式并发布了正确答案。

标签: java generics overriding


【解决方案1】:

您正在继承 raw A 类(未提供通用参数),根据 Java 语言规范的定义,该类从超类中剥离了所有通用信息。这意味着您的子类泛型方法与(现在)非泛型超类方法不兼容。

通过传递子类的泛型参数为A 提供泛型参数:

public class subA <E extends Comparable<E>> extends A<E> {      

    @Override 
    public void add (E toInsert) {
        // ...
    }
}

【讨论】:

    【解决方案2】:

    C++ 编程中的函数覆盖

    如果基类和派生类具有相同名称和参数的成员函数。如果您创建派生类的对象并编写代码来访问该成员函数,则仅调用派生类中的成员函数,即派生类的成员函数覆盖基类的成员函数。 C++ 编程中的这一特性称为函数覆盖。

    演示 C++ 编程中的函数覆盖的示例 从派生类访问基类中的重写函数

    要从派生类访问基类的重写函数,范围解析运算符::。例如:如果你想在上面的例子中从派生类中访问基类的get_data()函数,那么在派生类中使用下面的语句。

    A::get_data; // 调用A类的get_data()。

    这是因为,如果没有指定类名,编译器认为get_data()函数是在调用自己。

    覆盖函数中范围解析运算符的用户 - 查看更多信息:http://www.programiz.com/cpp-programming/function-overriding#sthash.7UmWybpS.dpuf

    【讨论】:

      【解决方案3】:
      public class subA <E extends A> extends A { 
      

      因为 E 是在 A 中定义的,所以您需要让泛型扩展 A 的相同泛型类型。我敢肯定有人会有比我更好的解释,但我知道这种方法行得通。

      【讨论】:

      • PLEASE在发布答案之前在您的 IDE 中尝试您的代码。
      猜你喜欢
      • 2018-06-21
      • 1970-01-01
      • 2016-03-06
      • 2018-03-27
      • 2014-05-27
      • 2014-01-04
      • 2021-11-11
      • 2010-11-16
      • 2021-05-16
      相关资源
      最近更新 更多