제 질문은 Java 7의 제네릭에 관한 것입니다.제네릭의 와일드 카드 : "? super T"는 "? extends T"가 작동하지 않는 동안 작동합니까?
interface Animal {}
class Lion implements Animal {}
class Butterfly implements Animal {}
또한 클래스
class Cage<T> {
private List<T> arr = new ArrayList<>();
public void add(T t) {
arr.add(t);
}
public T get() {
return arr.get(0);
}
}
다음은 코드입니다. 해당 클래스를 사용하는 :
질문 # 1 :
이러한 문제에 대한 here 읽었지만 Cage<?>
단순히있었습니다. 하지만 컴파일러 <? extends Animal>
에게 Cage<T>
의 T
유형은 Animal 유형의 하위 유형이 될 것이라고 알려줍니다. 그렇다면 왜 컴파일 시간 오류가 발생합니까?
Cage<? extends Animal> cage = ...
대신 Cage<? super Animal> cage = ...
를 지정하면 모든 것이 잘 작동하고 컴파일러가 아무런 문제가 없다고합니다. 위의 예제에서 실패한 이유는이 경우에 잘 작동하는 이유는 무엇입니까?
및 cage.add (새 Lion())도 컴파일되지 않습니다. – maks
고정 감사합니다. –
자바 튜토리얼에 따르면 "super"는 thay를 말합니다. Animal에 대한 수퍼 유형 인 모든 유형을 보유 할 수 있습니다. "코드 super Animal>은 따라서"Animal, 그 자체"". 그러나 Lion이나 Butterfly는 동물을위한 수퍼 유형이 아닙니다. 왜 작동합니까? – maks