Java 仅用于特定类型的泛型类
我有一个通用类木材:Java 仅用于特定类型的泛型类,java,generics,inheritance,Java,Generics,Inheritance,我有一个通用类木材: public class Wood<A>{ public A element; public Wood(A element) { this.elem = elem; } } 公共级木材{ 公共部门是一个要素; 公共木材(A元素) { this.elem=elem; } } 以及接口Prec: public interface Prec<A>{ public boolean prec(A a
public class Wood<A>{
public A element;
public Wood(A element)
{
this.elem = elem;
}
}
公共级木材{
公共部门是一个要素;
公共木材(A元素)
{
this.elem=elem;
}
}
以及接口Prec:
public interface Prec<A>{
public boolean prec(A a);
}
公共接口Prec{
公共布尔prec(A);
}
我想创建一个新类,它从Wood中获取所有属性,并使用一些新方法对其进行扩展。这些方法要求类型A的对象实现接口Prec。因此我认为,该代码是有效的:
public class SortedWood<A extends Prec> extends Wood<A>
{
}
公共类分拣木材扩展木材
{
}
但我得到以下错误:
SortedWood.java:1: error: constructor Wood<A#2> cannot be applied to given types:
public class SortedWood<A extends Prec> extetends Wood<A>
required: A#1
found: no arguments
reason: actual and formal argument lists differ in length
where A#1,A#2 are type-variables:
A#1 extends Prec declared in class SortedWood
A#2 extends Object declared in class Wood
SortedWood.java:1:错误:构造函数Wood不能应用于给定类型:
公共级分类木材
必填项:A#1
找到:没有参数
原因:实际参数列表和正式参数列表长度不同
其中A#1、A#2是类型变量:
A#1扩展了SortedWood类中声明的Prec
A#2扩展类Wood中声明的对象
这里的问题是什么?我如何解决它?来自JLS§8.8.9:
如果隐式声明了默认构造函数,但超类没有可访问的构造函数(§6.6),且该构造函数不带参数且没有throws子句,则这是编译时错误
这意味着,如果您的父类没有默认构造函数,但您的子类有,那么您就有一个编译错误
让我们移除泛型,然后像这样看它:
public class Parent {
private int age;
public Parent(int age) {
this.age = age;
}
}
public class Child extends Parent {
public Child() {
}
}
上面的代码不会编译,因为Parent
中没有默认的或没有参数构造函数。子类无法调用父类的构造函数,因为它不存在
如果我们修正它,使它引用super
public class Child extends Parent {
public Child(int age) {
super(age);
}
}
…然后编译器又高兴了。不,这是不允许的。错误:>预期值(在SortedWoodI之后,我得到了一个不同的编译时错误-
Wood
没有无参数构造函数,所以它就爆炸了。我为Wood添加了一个无参数构造函数,现在代码似乎可以工作了。谢谢。任何解释,为什么有必要使用无参数构造函数?因为Wood类型的对象应该始终使用元素。我不需要/想要无参数构造函数。
有一个原始类型。它应该是@JonnyHenlyextends
关键字用于泛型边界中的超类和接口。谢谢,这就是问题所在。有一次我调用了super(elem),它起作用了。这个答案的措辞有误导性。构造函数不是继承的,也没有任何东西要求子类构造函数看起来像超类构造函数。唯一的要求是每个子类构造函数都必须有一个对某个超级
或其他的调用作为其第一个语句,无论是显式的还是隐式的y、 更好,但是子类有一个默认构造函数还是可以的,它只需要有一个静态值就可以调用。