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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top