我有一个通用类Wood:

public class Wood<A>{
    public A element;

    public Wood(A element)
    {
        this.elem = elem;
    }
}


和接口Prec:

public interface Prec<A>{
    public boolean prec(A 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


这是什么问题,我该如何解决?

最佳答案

从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);
    }
}


...然后编译器再次感到高兴。

关于java - 仅特定类型的通用类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27007993/

10-09 05:25