? extends HasWord
"확장되는 클래스 / 인터페이스"를 의미합니다 HasWord
. 다시 말해, HasWord
그 자체 또는 그 자식 중 하나는 기본적으로 instanceof HasWord
plus 와 함께 작동하는 모든 것입니다 null
.
보다 기술적 인 용어로, 139 페이지에서 시작하는 Effective Java 3rd Edition? extends HasWord
의 항목 31에서 다루는 경계 와일드 카드 입니다. 2nd Edition과 동일한 장이 온라인으로 PDF로 제공됩니다 . 경계 와일드 카드의 부분은 134 페이지에서 시작하는 항목 28입니다.
업데이트 : Oracle이 한동안 그것을 제거한 후 PDF 링크가 업데이트되었습니다. 이제는 Queen Queen University of London의 전자 공학 및 컴퓨터 과학 학교에서 주최하는 사본을 가리 킵니다.
업데이트 2 : 와일드 카드를 사용하려는 이유에 대해 좀 더 자세히 살펴 보겠습니다.
서명을 전달할 것으로 예상되는 메소드를 선언하면 전달할 List<HasWord>
수있는 유일한 것은 List<HasWord>
입니다.
그러나 서명이 있었다면 대신 List<? extends HasWord>
전달할 수 List<ChildOfHasWord>
있습니다.
List<? extends HasWord>
와 사이에는 미묘한 차이가 List<? super HasWord>
있습니다. Joshua Bloch가 말했듯이 PECS = 생산자 확장, 소비자 슈퍼.
이것이 의미하는 것은 메소드가 데이터를 가져 오는 콜렉션을 전달하는 경우 (즉, 콜렉션이 사용하는 메소드에 대한 요소를 생성하는 경우) 사용해야합니다 extends
. 메소드가 데이터를 추가하는 콜렉션을 전달하는 경우 (즉, 콜렉션이 메소드를 작성하는 요소를 소비하는 경우)를 사용해야합니다 super
.
혼란 스러울 수 있습니다. 그러나 List
의 sort
명령 에서 볼 수 있습니다 (이것은 Collections.sort의 두 가지 버전의 바로 가기입니다). 을 복용하는 대신 Comparator<T>
실제로을 사용합니다 Comparator<? super T>
. 이 경우 비교기는 List
List 자체를 재정렬하기 위해 의 요소를 소비합니다 .