문제

나는 이것을 알아 내려고 노력하는 데 어려움을 겪고 있습니다. 다음 코드가 있다고 말합니다.

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() 메소드를 반환합니다 list 항상 포함됩니다 Mammal 객체를 할당 할 수 있어야합니다. 내가 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

왜냐하면 getMammals a List<Giraffe>, 그리고 그것이 변환 가능하다면 List<Mammal> 그런 다음 a를 추가 할 수 있습니다 Zebra 그것에. 추가 할 수 없습니다 Zebra 목록에 Giraffe, 할 수 있나요?

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

다른 팁

글쎄, 그것은 불행히도 그렇게 작동하지 않습니다.

getMammals ()를 선언 할 때 돌아 오도록 선언 할 때 List<? extends Mammal> 그것은 그것이 돌아올 수 있음을 의미합니다 List<Mammal> 또는 List<Giraffe> 하지만 List<Animal>

당신의 main ()은 다음과 같아야합니다.

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

보시다시피 메소드를 재정의 할 때 리턴 유형의 메소드 유형을 과부하 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top