2011-09-24 1 views
5

제 질문은 Java 7의 제네릭에 관한 것입니다.제네릭의 와일드 카드 : "? super T"는 "? extends T"가 작동하지 않는 동안 작동합니까?

interface Animal {}  
class Lion implements Animal {}  
class Butterfly implements Animal {} 

Java Generics Tutorial

또한 클래스

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 유형의 하위 유형이 될 것이라고 알려줍니다. 그렇다면 왜 컴파일 시간 오류가 발생합니까?

질문 2 :

Cage<? extends Animal> cage = ... 대신 Cage<? super Animal> cage = ...를 지정하면 모든 것이 잘 작동하고 컴파일러가 아무런 문제가 없다고합니다. 위의 예제에서 실패한 이유는이 경우에 잘 작동하는 이유는 무엇입니까?

답변

6

케이지는 모두 동물 유형을 수용 할 수 있어야합니다. "슈퍼"는 케이지가 보유 할 수 있어야한다고 말합니다. 은 동물의 수퍼 클래스 일 수 있기 때문에 모든 동물의 유형 및 어쩌면 다른 것들도 보유 할 수 있어야한다고 말합니다. ,

Cage<? extends Animal> cage = new Cage<Lion>(); 

유효한 문이 될 것입니다,하지만 분명히 사자 케이지는 나비를 보유하지 않습니다 어쩌면 그냥 라이온스는, 예를 들어, 같이 - "확장"이 동물의 일부가지을 보유 할 수 있다고 말한다 그래서

cage.add(new Butterfly()); 

컴파일되지 않습니다. Cage<? extends Animal> - - 지금 당장 (Cage<Lion>) 그것은에 할당 된 객체 여기에 자바 케이지의 선언에서 찾고 있기 때문에 문

cage.add(new Lion()); 

은 어느 컴파일하지 않을 것입니다.

제네릭에 대한 가장 잘 알려진 설명은 O'Reilly's Java in a Nutshell입니다. 이 장은 무료 온라인입니다 (part 1part 2).

+0

및 cage.add (새 Lion())도 컴파일되지 않습니다. – maks

+0

고정 감사합니다. –

+1

자바 튜토리얼에 따르면 "super"는 thay를 말합니다. Animal에 대한 수퍼 유형 인 모든 유형을 보유 할 수 있습니다. "코드 은 따라서"Animal, 그 자체"". 그러나 Lion이나 Butterfly는 동물을위한 수퍼 유형이 아닙니다. 왜 작동합니까? – maks