2013-02-18 3 views
2

나는 자바에 익숙하지 않고 자바 제네릭과 컬렉션 책에서 호기심 많은 구문을 이해하려고 노력하고있다. (나는 C++ 템플릿으로 광범위하게 작업했기 때문에 일반적인 프로그래밍과 잡다한 잡초의 기초를 이해한다고 주장 할 수있다) :"? extends E"와 "T extends E"의 차이점은 무엇입니까?

interface Collection <E> { 
    ... 
    public boolean addAll(Collection<T extends E> c); 
    ... 
} 

차이점은 무엇입니까 :로

interface Collection <E> { 
    ... 
    public boolean addAll(Collection<? extends E> c); 
    ... 
} 

이유는 위의 기록 할 수 없습니다 ? 언어 제한 일 뿐이거나 후드 아래에 어떤 차이가 있습니까?

답변

6

는 그것은

public <T extends E> boolean addAll(Collection<T> c) 

로 기록 될 수 있지만 아무 소용이 없을 것이다. 이 매개 변수의 이름을 지정할 필요가 없습니다.

+2

당신은'public 부울 addAll (콜렉션 c)를 말합니다. ' –

+1

나는 이전 코멘트에주의를 기울이기 위해 이것을 downvoted했습니다. –

+0

이제 해결되었습니다. –

3

메서드가 T 유형의 무언가를 반환하면 의미가 있습니다. 그러면 두 유형을 모두 일치시킬 수 있습니다. 그러나 부울을 반환하기 때문에 그렇게 할 필요가 없습니다. 그러면 T라는 이름을 설정할 필요가 없으며 물음표로 남습니다.

의이 오퍼레이션과 addAll 필터를 취한다고 가정 해 봅시다 :
public <T extends E> boolean addAll(Collection<T> c, Predicate<T> aFilter); 

은 이제 술어가 수집 C에서 작동 할 수 제네릭 형식을 가지고 있음을 알고있다.