Frage

Ich habe eine harte Zeit versucht, dieses herauszufinden. Sagen wir, ich habe den folgenden Code:

class Animal { }
class Mammal extends Animal { }
class Giraffe extends Mammal { }
...
public static List<? extends Mammal> getMammals() { return ...; }
...

public static void main(String[] args) {
    List<Mammal> mammals = getMammals(); // compilation error
}

Warum funktioniert das Zuweisungsergebnis in einem Übersetzungsfehler? Der Fehler ist so etwas wie:

Type mismatch: cannot convert from List<capture#4-of ? extends Mammal> to List<Mammal>

Nach meinem Verständnis der Kovarianz, gibt die getMammals() Methode ein list die Mammal Objekte immer enthalten wird, so sollte es zuordenbar sein. Was bin ich?

War es hilfreich?

Lösung

Da getMammals einen List<Giraffe> zurückkehren konnte, und wenn das konvertierbar ist List<Mammal> dann würden Sie in der Lage sein, einen Zebra, um es hinzuzufügen. Sie können nicht erlaubt werden, um eine Zebra auf eine Liste von Giraffe hinzufügen möchten, können Sie?

class Zebra extends Mammal { }

List<Giraffe> giraffes = new List<Giraffe>();

List<Mammal> mammals = giraffes; // not allowed

mammals.add(new Zebra()); // would add a Zebra to a list of Giraffes

Andere Tipps

Nun, es funktioniert nicht wie die leider.

Wenn Sie getMammals (), um Rückkehr List<? extends Mammal> erklären bedeutet es es List<Mammal> oder List<Giraffe> zurückkehren kann, aber nicht List<Animal>

Ihr main () soll wie folgt aussehen:

public static void main(String[] args) {
    List<? extends Mammal> mammals = getMammals();
    Mammal mammal = mammals.get(0);
}

EDIT: In Bezug auf die Kovarianz, das ist, was in der Regel damit gemeint ist:

class Animal {
    public Animal getAnimal() {return this;}
}

class Mammal extends Animal {
    public Mammal getAnimal() {return this;}
}

class Giraffe extends Mammal {
    public Giraffe getAnimal() {return this;}
}

Wie Sie es erlaubt Überlastung Rückgabetyp Methoden sehen können, wenn Sie die Methode überschrieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top