2010-02-11 2 views
25

컬렉션에 대해 get and put principle을 이해합니다. 메소드가 형식 T를 쓸 컬렉션을 가져 오는 경우 매개 변수는 Collection<? super T>이어야하며 반면에 에서 T를 입력하면 매개 변수는 Collection<? extends T>이어야합니다.Java generics : Collections.max() 시그너처 및 비교 자

그러나 누군가가 Collections.max() 서명 설명해주십시오 수 : 특히

public static <T> T max(Collection<? extends T> coll, 
        Comparator<? super T> comp) 

이 왜 Comparator<? super T> 대신 Comparator<? extends T>입니다?

답변

65

조쉬 블로치의 니모닉 PECS이 유용합니다. 그것은 약자에 대한 :

프로듀서 extends, 소비자 super이 파라미터 화 된 형태가 메서드에 전달 될 때 T 인스턴스 (그들이 어떤 방법으로 그것을에서 검색됩니다), ? extends T 정상적으로 생성된다는 것을 의미합니다

T의 서브 클래스의 인스턴스는 모두 T이기 때문에 사용할 수 있습니다.

파라미터 화 된 형태는 T 인스턴스 (그들이 뭔가를하고 그것을 전달됩니다), T의 인스턴스가 법적으로 허용 어떤 방법으로 전달 될 수 있기 때문에 ? super T 사용해야을 소비하는 방법에 전달되는 경우 일부 수퍼 유형은 T입니다. A Comparator<Number>은 예를 들어 Collection<Integer>에서 사용할 수 있습니다. Comparator<Integer>Collection<Number>에서 작동 할 수 없기 때문에 ? extends T이 작동하지 않습니다.

편집 :

public T something(); 
    ^

위는 T을 생산하는 방법이다 : 는 GET/풋 (생산/소비)에 좀 더 명확합니다.

public void something(T t); 
        ^

위의 방법은 T을 소비하는 방법입니다.

"생산자 extends, 소비자 super"은 매개 변수가있는 개체가 전달되는 방법에서 해당 개체를 사용하는 방법에 적용됩니다. Collections.max()의 경우 항목은 Collection에서 검색되므로 제작자입니다. 이러한 항목은 Comparator의 메서드에 인수로 전달되므로 소비자입니다.

0

비교기는 T을 인수로 취할 수 있어야합니다.

+0

어쩌면 내가 이해할 수 없을 것 같아요. –

+6

"PECS"에 대해 설명하는 Effective Java 장을 읽는 것이 좋습니다. 그리고 이런 식으로 생각하십시오. 내가 Doubles의 목록을 정렬하도록 요청하고 비교 자 을주었습니다. 어떻게 생각 하시나요? –

+0

답을 넓힐 수 있습니까? 진보 된 자바 프로그래머에게는 대답이 명확한 반면, 당신이 말하는 내용을 완전히 이해하려면 질문을 다시 읽어야합니다. 나는 이것이 당신의 이전 답변 중 하나 일 수 있지만 낮은 품질 게시물 검토 섹션에 나타납니다. - [리뷰에서] (https://stackoverflow.com/review/low-quality-posts/11445740) – Ferrybig

1

비교기는 Ts 쌍을 소비하고 int를 생성합니다. 컬렉션은 Comparator가 소비하는 Ts를 생성합니다.

슈퍼 소모, 확장 생성.

get 및 put 원칙과 관련하여 생성 및 가져 오기는 소비합니다.