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

为什么我需要在这个Java泛型子类中有一个构造函数?,java,subclass,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 ext

我正在使用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);
    }
}
公共类测试{
T数据;
公共测试(T数据){
这个数据=数据;
}
公共T getData(){
返回此.data;
}
}
类MyClass扩展测试{
//如果我删除这个构造函数,代码将无法编译
公共MyClass(T数据){
超级(数据);
}
}
在MyClass中,如果没有构造函数,则会出现以下编译时错误:

Implicit super constructor Test<T>() is undefined for default constructor. Must define an explicit constructor
默认构造函数的
隐式超级构造函数Test()未定义。必须定义显式构造函数
为什么编译器让我这样做?

(这个问题与泛型无关。)

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


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

事实上,这与泛型无关。一旦声明构造函数,隐含的无参数构造函数就不再存在。此外,构造函数不是继承的。这是相当基本的Java语言规则,与泛型无关。好的,感谢您的澄清。该链接的可能副本非常有用。非常感谢。哦,好的。你知道为什么吗?它是Java语言规范(JLS)的一部分。C++具有相同的性质。如果您提供带参数的编译器生成的默认构造函数,则会自动删除。因为
MyClass
或任何没有显式构造函数的类的默认构造函数始终是一个只调用
super()
的无参数构造函数,在这里实际上不起作用。@user3270407由于歧义,VM无法知道作为参数传递什么。@user3270407一旦在类中声明构造函数,它就不再有默认构造函数。