Java Generics未定义隐式超级构造函数

时间:2013-09-23 08:38:03

标签: java generics java-6

我有以下基类和子类:

public class BaseClass<T> {
    public BaseClass(T value){
}

public class NewClass<T> extends BaseClass<T> {
    public NewClass(T value){
    }
} 

我收到以下错误:隐式超级构造函数BaseClass()未定义。必须显式调用另一个构造函数

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

将子类cosntructor更改为:

public class NewClass<T> extends BaseClass<T> {
    public NewClass(T value){
        super(value);
    }
} 

如果你不添加super(value);,那么编译器会自动添加一个super();,它将链接到超类的0-arg构造函数。基本上,您的原始子类构造函数被编译为:

public NewClass(T value){
    super();
}

现在你可以看到,它试图调用编译器找不到的0-arg超类构造函数。为什么?因为在超类中,你提供了一个1-arg构造函数,编译器不会在那里添加任何默认构造函数。因此,这个错误。

您还可以通过在超类中提供明确的0-arg构造函数来避免此问题,在这种情况下,您的原始子类代码将正常工作。

答案 1 :(得分:1)

如果要求显式调用另一个构造函数,只需执行:

public class NewClass<T> extends BaseClass<T> {
    public NewClass(T value){
        super(value);
    }
}