2009-07-26 24 views
7

Me está costando mucho intentar resolver esto. Supongo que tengo el siguiente código:Covarianza de Java

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é la asignación da como resultado un error de compilación? El error es algo así como:

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

Según mi entendimiento de la covarianza, el método devuelve un getMammals()list que siempre contendrá objetos Mammal lo que debe ser asignable. ¿Qué me estoy perdiendo?

Respuesta

19

Debido getMammals podría volver un List<Giraffe>, y si eso era convertible a List<Mammal> entonces sería capaz de añadir un Zebra a ella. No se le puede permitir agregar un Zebra a una lista de Giraffe, ¿o sí?

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 
6

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>

saluda 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 generalmente se entiende por eso:

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 puede ver, permite sobrecargar retu rn tipo de métodos cuando anula el método.

+0

+ 1, pero ¿podría explicar qué significa "Lista o lista pero no lista"? : p –

+0

Reformateado para eliminar la confusa 'Lista o Lista pero no Lista' :-) –

+0

Los genéricos se estaban tratando como html, escapé de –

Cuestiones relacionadas