Constructor kan niet worden toegepast op bepaalde typen?

Ik heb de volgende Java-code:

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

En ik krijg steeds de foutmelding: “constructor kan niet worden toegepast op gegeven type”… Betekent dit dat de subklasse van de superklasse hetzelfde aantal parameters in de constructor moet hebben als de superklasse? Ik ben al een uur met mijn hoofd tegen de muur aan het bonken.


Antwoord 1, autoriteit 100%

Een subklasse hoeft geen constructor te hebben met “hetzelfde aantal parameters in de constructor als de superklasse”, maar het welmoet enkele constructors van zijn superklasse aanroepen vanuit zijn eigen constructor .

Als de superklasse een no-arg-constructor heeft, wordt deze standaard aangeroepen als een expliciete aanroep van een superklasse-constructor wordt weggelaten of als de subklasse helemaal geen expliciete constructor heeft (zoals in uw geval), maar aangezien uw superklasse dat wel doet geen no-arg constructor hebben, compilatie mislukt.

Je zou zoiets als dit kunnen toevoegen aan je EmptyList:

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

Het kan ook een beter idee zijn om in plaats daarvan een abstracte superklasse te hebben waarvan beide klassen erven, maar dat is een keuze.


Antwoord 2, autoriteit 25%

Je zou expliciet een no-arg-constructor aan WeirdList moeten toevoegen, aangezien EmptyList een standaard no-arg-constructor heeft, maar geen constructor in de superklasse die het kan aanroepen.


Antwoord 3

Als je een methode aanroept, moeten de aanroep en de aanroep overeenkomen met de parameters en het retourtype. Een speciaal geval met constructors is dat als je er geen maakt, de compiler een lege constructor invoegt void Weird(){} je kunt een klasse overbelasten en veel constructors hebben, degene die wordt uitgevoerd is degene met dezelfde handtekening, dwz typen. wat je probeert is iets te doen dat al in Java is ingebouwd in de Java-klasse LinkedList, Vector, List.

Other episodes