5

我有以下 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;
        }
}

而且我不断收到错误消息:“构造函数不能应用于给定类型”......这是否意味着超类的子类必须在构造函数中具有与超类相同数量的参数?我已经用头撞墙了一个小时。

4

3 回答 3

9

子类不必有任何“构造函数中的参数数量与超类相同”的构造函数,但它必须从自己的构造函数中调用其超类的一些构造函数。

如果超类有一个无参数的构造函数,如果省略对超类构造函数的显式调用或者子类根本没有显式构造函数(如您的情况),则默认调用它,但是由于您的超类没有无参数构造函数,编译失败。

您可以将这样的内容添加到您的EmptyList

private EmptyList() {
    super(0, null);
}

相反,拥有两个类都继承自的抽象超类也可能是一个更好的主意,但这是一个选择。

于 2013-09-29T05:02:38.493 回答
2

您需要向 WeirdList 显式添加一个无参数构造函数,因为 EmptyList 有一个默认的无参数构造函数,但它在它可以调用的超类中没有构造函数。

于 2013-09-29T05:04:40.530 回答
0

当您调用任何方法时,调用和被调用必须匹配参数和返回类型。构造函数的特殊情况是,如果您不创建一个,编译器将插入一个空白构造函数 void Weird(){} 您可以重载一个类并拥有许多构造函数,将执行的构造函数是具有相同签名的构造函数,即类型。您正在尝试的是在 LinkedList、Vector、List java 类中已经内置到 java 中。

于 2013-09-29T05:24:41.183 回答