我有以下Java代码:
public class WeirdList {
/** The empty sequence of integers. */
/*ERROR LINE */ public static final WeirdList EMPTY = new WeirdList.EmptyList();
/** A new WeirdList whose head is HEAD and tail is TAIL. */
public WeirdList(int head, WeirdList tail) {
headActual = head;
tailActual = tail;
}
/** Returns the number of elements in the sequence that
* starts with THIS. */
public int length() {
return 1 + this.tailActual.length();
}
/** Apply FUNC.apply to every element of THIS WeirdList in
* sequence, and return a WeirdList of the resulting values. */
public WeirdList map(IntUnaryFunction func) {
return new WeirdList(func.apply(this.headActual), this.tailActual.map(func));
}
/** Print the contents of THIS WeirdList on the standard output
* (on one line, each followed by a blank). Does not print
* an end-of-line. */
public void print() {
System.out.println(this.headActual);
this.tailActual.print();
}
private int headActual;
private WeirdList tailActual;
private static class EmptyList extends WeirdList {
public int length() {
return 0;
}
public EmptyList map(IntUnaryFunction func) {
return new EmptyList();
}
public void print() {
return;
}
}
我一直得到错误:“构造函数不能应用于给定类型”...这是否意味着超类的子类必须在构造函数中具有与超类相同数量的参数?我一直在墙上撞了一个小时。
答案 0 :(得分:7)
子类不必具有“构造函数中与超类相同数量的参数”的任何构造函数,但 必须从其自己的构造函数中调用其某些超类构造函数
如果超类具有no-arg构造函数,则默认情况下会调用它,如果省略对超类构造函数的显式调用,或者子类根本没有显式构造函数(就像你的情况一样),但是因为你的超类确实如此没有no-arg构造函数,编译失败。
您可以在EmptyList
上添加类似内容:
private EmptyList() {
super(0, null);
}
也许更好的想法是拥有一个你的两个类继承的抽象超类,但这是一个选择。
答案 1 :(得分:2)
你需要向WeirdList显式添加一个no-arg构造函数,因为EmptyList有一个默认的no-arg构造函数,但是在它可以调用的超类中没有构造函数。
答案 2 :(得分:0)
当你调用任何方法时,call和callie必须匹配参数和返回类型。构造函数的特殊情况是,如果你不做一个,编译器将插入一个空的构造函数void Weird(){}你可以重载一个类并有许多构造函数,将执行的那个是具有相同签名的那个,即types.what你正在尝试的是在LinkedList,Vector,List java类中已经构建了一些内置的东西。