为什么我需要在这个Java通用子类中有一个构造函数?

Rob*_*b L 3 java subclass

我正在使用Java泛型.这是一个代码示例,后跟问题.

public class Test<T extends Comparable<T>>  {

    T data;

    public Test(T data) {

           this.data = data;
    }

    public T getData() {

            return this.data;
    }
}

class MyClass<T extends Comparable<T>> extends Test<T> {
        //if I remove this constructor, code will not compile
    public MyClass(T data) {

        super(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

在MyClass中,如果我没有构造函数,则会出现以下编译时错误:

Implicit super constructor Test<T>() is undefined for default constructor. Must define an explicit constructor
Run Code Online (Sandbox Code Playgroud)

为什么编译器让我这样做?

Bat*_*eba 5

(此问题与泛型无关.)

Test 没有默认(即没有参数)构造函数.

因此,您的子类需要显式调用您提供的单个构造函数Test.(由于这种模糊性,编译器无法弄清楚要做什么 - 它如何知道要传递哪个参数 - 因此它会引发编译时错误.)

  • 它是Java语言规范(JLS)的一部分.C++具有相同的属性.如果您提供带参数的构造函数,则会自动删除编译器生成的默认构造函数. (3认同)
  • @ user3270407只要在类中声明构造函数,它就不再具有默认构造函数. (2认同)