2009-07-26 6 views
7

저는 이것을 알아 내려고 애 쓰고 있습니다. 다음 코드를 가지고 있다고 가정 해 봅시다 :자바 공분산

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 
} 

왜 할당 오류가 발생합니까?

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

공분산에 대한 이해에 따르면, getMammals() 방법은 할당해야하므로 항상 Mammal 개체를 포함하는 list를 반환 :이 오류는 같은입니다. 내가 뭘 놓치고 있니?

답변

19

getMammals 있기 때문에 List<Giraffe>를 반환 할 수 있으며, 그 List<Mammal>에 convertable 있다면 당신은 그것에 Zebra을 추가 할 수있을 것입니다. Giraffe 목록에 Zebra을 추가 할 수 없습니까?

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

글쎄, 불행히도 그렇게 작동하지 않습니다. 당신이 getMammals를 선언 할 때

는() List<? extends Mammal>를 반환 그것이 List<Mammal> 또는 List<Giraffe>하지만 List<Animal>

를 반환 할 수 있다는 것을 의미 너의 주()과 같아야합니다

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

편집이 : 공분산에 대해서, 그건 보통 그 의미는 다음과 같습니다.

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;} 
} 

위에서 볼 수 있듯이 retu 메서드를 재정의 할 때 rn 유형의 메서드

+0

+1,하지만 "목록 또는 목록이지만 목록이 아니라"는 것을 설명 할 수 있습니까?! : p –

+0

혼란스러운 'List or List but not list'를 제거하기 위해 재 포맷팅 됨 :-) –

+0

제네릭이 html로 취급되었으며, 회피되었습니다 –