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类型的对象应该始终使用元素。我不需要/想要无参数构造函数。
有一个原始类型。它应该是
@JonnyHenly
extends
关键字用于泛型边界中的超类和接口。谢谢,这就是问题所在。有一次我调用了super(elem),它起作用了。这个答案的措辞有误导性。构造函数不是继承的,也没有任何东西要求子类构造函数看起来像超类构造函数。唯一的要求是每个子类构造函数都必须有一个对某个
超级
或其他的调用作为其第一个语句,无论是显式的还是隐式的y、 更好,但是子类有一个默认构造函数还是可以的,它只需要有一个静态值就可以调用。