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

そして、「コンストラクターを指定された型に適用できません」というエラーが表示され続けます...それは、スーパークラスのサブクラスがコンストラクターにスーパークラスと同じ数のパラメーターを持たなければならないことを意味しますか? 私は1時間壁に頭をぶつけていました。

4

3 に答える 3

9

サブクラスは、「コンストラクター内にスーパークラスと同じ数のパラメーター」を持つコンストラクターを持つ必要はありませんが独自のコンストラクターからスーパークラスのコンストラクターのいくつかを呼び出す必要があります。

スーパークラスに引数のないコンストラクターがある場合、スーパークラス コンストラクターへの明示的な呼び出しが省略された場合、またはサブクラスに明示的なコンストラクターがまったくない場合 (あなたの場合のように)、デフォルトで呼び出されますが、スーパークラスには引数なしのコンストラクタ、コンパイルは失敗します。

次のようなものをに追加できますEmptyList

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

代わりに、両方のクラスが継承する抽象スーパークラスを用意する方がよい場合もありますが、それは選択の余地があります。

于 2013-09-29T05:02:38.493 に答える
2

EmptyList にはデフォルトの引数なしのコンストラクターがありますが、呼び出すことができるスーパークラスにコンストラクターがないため、引数なしのコンストラクターを WeirdList に明示的に追加する必要があります。

于 2013-09-29T05:04:40.530 に答える
0

メソッドを呼び出すときは、呼び出しと呼び出し元がパラメーターと戻り値の型に一致する必要があります。コンストラクターの特殊なケースは、コンパイラーが空のコンストラクター void Weird(){} を挿入するものを作成しない場合です。クラスをオーバーロードして、多くのコンストラクターを持つことができます。実行されるのは、同じ署名、つまり型を持つコンストラクターです。あなたがしようとしているのは、すでにLinkedList、Vector、List JavaクラスにあるJavaに組み込まれていることです。

于 2013-09-29T05:24:41.183 に答える