? extends HasWord
"확장되는 클래스 / 인터페이스"를 의미합니다 HasWord. 다시 말해, HasWord그 자체 또는 그 자식 중 하나는 기본적으로 instanceof HasWordplus 와 함께 작동하는 모든 것입니다 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>. 이 경우 비교기는 ListList 자체를 재정렬하기 위해 의 요소를 소비합니다 .