Pregunta
Estoy teniendo un mal rato tratando de resolver esto. Decir que tengo el siguiente código:
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
}
¿Por qué el resultado de la asignación en un error de compilación? El error es algo como:
Type mismatch: cannot convert from List<capture#4-of ? extends Mammal> to List<Mammal>
De acuerdo con mi comprensión de la covarianza, el método devuelve un getMammals()
list
que siempre contendrá objetos Mammal
lo que debe ser asignable. ¿Qué me falta?
Solución
Debido getMammals
podría devolver un List<Giraffe>
, y si eso era convertible a List<Mammal>
entonces sería capaz de añadir un Zebra
a ella. No se puede permitir añadir un Zebra
a una lista de Giraffe
, puede usted?
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
Otros consejos
Bueno, no funciona así por desgracia.
Cuando se declara getMammals () para devolver List<? extends Mammal>
que significa que puede volver List<Mammal>
o List<Giraffe>
pero no List<Animal>
El suyo main () debe tener este aspecto:
public static void main(String[] args) {
List<? extends Mammal> mammals = getMammals();
Mammal mammal = mammals.get(0);
}
EDIT: En cuanto a la covarianza, eso es lo que habitualmente se entiende por que:
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;}
}
Como se puede ver que permite a la sobrecarga de tipo de retorno de los métodos cuando reemplazando el método.