1

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

错误信息读取:

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

超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    
{...}  

}
4

3 回答 3

7

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

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

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

    @Override 
    public void add (E toInsert) {
        // ...
    }
}
于 2013-06-02T01:49:34.453 回答
0

C++ 编程中的函数覆盖

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

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

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

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

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

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

于 2013-06-18T11:07:26.387 回答
-4
public class subA <E extends A> extends A { 

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

于 2013-06-02T01:46:54.343 回答