重写方法

时间:2013-06-02 01:38:39

标签: java generics override

类subA是类A的子类。我试图覆盖一个方法,但不知怎的,它不允许我覆盖它。这是为什么?是因为参数?

中的参数

读取错误消息:

  

名称冲突:在subA中添加(E#1)并在A中添加(E#2)具有相同的删除,但是不会覆盖另一个   其中E#1,E#2是类型变量:
  E#1扩展了在类subA中声明的Object   E#2扩展了在A类中声明的Object

超级A:

public class A <E> {    

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

}

SubClass subA:

public class subA <E> extends A {      

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

}

3 个答案:

答案 0 :(得分:7)

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

通过传递子类的泛型参数为<{1}}提供通用参数:

A

答案 1 :(得分:0)

C ++编程中的函数重写

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

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

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

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

这是因为,如果未指定类的名称,编译器会认为get_data()函数正在调用它自己。

覆盖函数中范围解析运算符的用户 - 请参阅:http://www.programiz.com/cpp-programming/function-overriding#sthash.7UmWybpS.dpuf

答案 2 :(得分:-4)

public class subA <E extends A> extends A { 

因为E在A中定义,所以你需要让你的泛型扩展相同的泛型A。我相信有人会有比我更好的解释,但我知道这种方式有效。