1. ホーム
  2. Web プログラミング
  3. その他全般

[解決済み】コンストラクタが与えられた型に適用できない?

2021-12-29 21:26:14

質問

コードは次のとおりです。

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

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