为什么我需要在这个Java泛型子类中有一个构造函数?
我正在使用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
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一旦在类中声明构造函数,它就不再有默认构造函数。