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?
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.