1. ホーム
  2. java

[解決済み] コンストラクタは、指定された型に適用できないのですか?

2022-01-25 15:42:40

質問

次のような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;
        }
}

そして、「"constructor cannot be applied to given type"」というエラーが出続けています...。これは、スーパークラスのサブクラスは、スーパークラスと同じ数のパラメータをコンストラクタに持たなければならないということでしょうか?小一時間、壁に頭を打ち付けています。

どうすればいい?

サブクラスは、コンストラクタにスーパークラスと同じ数のパラメータを持つコンストラクタを持つ必要はありません" が する は、自身のコンストラクタからそのスーパークラスのコンストラクタのいくつかを呼び出さなければなりません。

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

このようなものを EmptyList :

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

また、両方のクラスが継承する抽象的なスーパークラスを用意する方がよいかもしれませんが、それは選択の自由です。