Program Tip

Collections.max () 서명에서 T가 Object에 묶여있는 이유는 무엇입니까?

programtip 2020. 11. 5. 18:52
반응형

Collections.max () 서명에서 T가 Object에 묶여있는 이유는 무엇입니까?


Java 7의 java.util.Collections클래스 구현을 살펴 보고 이해가 안되는 것을 보았습니다. 에서 max함수 서명, 왜 T에 묶여 Object?

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
    Iterator<? extends T> i = coll.iterator();
    T candidate = i.next();

    while (i.hasNext()) {
        T next = i.next();
        if (next.compareTo(candidate) > 0)
            candidate = next;
    }
    return candidate;
} 

max Object bound가 생략되면 잘 작동하는 것 같습니다.

public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll) {
    Iterator<? extends T> i = coll.iterator();
    T candidate = i.next();

    while (i.hasNext()) {
        T next = i.next();
        if (next.compareTo(candidate) > 0)
            candidate = next;
    }
    return candidate;
}

실제로 경계가 차이를 만드는 상황이 있습니까? 그렇다면 구체적인 예를 제공하십시오.


두 사람은 같은 경계를 가지고 있지만이 있다 미묘한 차이.

 <T extends Object & Comparable<? super T>> 

이것은 언더 삭제 T가 될 Object입니다.

 <T extends Comparable<? super T>>

이 원인이됩니다 T되기 위해 Comparable삭제 아래에.


이 경우 .maxJava 5보다 이전 이기 때문에 수행 됩니다. 이 링크에서 Joachim .max은 Java 1.4.2 의 서명 이 다음과 같음을 친절하게 제공했습니다 .

public static Object max(Collection coll)

<T extends Comparable<? super T>>경계로 사용했다면 서명은 다음과 같습니다.

public static Comparable max(Collection coll)

API가 깨질 것입니다. 이전 API를 일반 API로 변환하는 방법에 대해 설명하는 이 페이지 를 찾았 .max으며 특정 예제로 제공 됩니다.

여기에서는 왜 이렇게 max정의 되었는지 설명합니다 .

또한 수정 된 API가 이전 클라이언트와 바이너리 호환성을 유지하는지 확인해야합니다. 이는 API 삭제가 원래의 비정상 API와 동일해야 함을 의미합니다. 대부분의 경우 이것은 자연스럽게 빠지지만 미묘한 경우가 있습니다. 우리가 만난 가장 미묘한 사례 중 하나 인 method를 살펴 보겠습니다 Collections.max(). 와일드 카드를 사용한 더 많은 재미 섹션에서 보았 듯이 그럴듯한 서명 max()은 다음과 같습니다.

public static <T extends Comparable<? super T>> T max(Collection<T> coll)이 서명의 삭제 public static Comparable max(Collection coll)가 max ()의 원래 서명과 다른 점을 제외하면 괜찮습니다 .public static Object max(Collection coll)

확실히 max ()에 대해이 서명을 지정할 수 있었지만 완료되지 않았으며 Collections.max ()를 호출하는 모든 이전 바이너리 클래스 파일은 Object를 반환하는 서명에 의존합니다.

참고 URL : https://stackoverflow.com/questions/19488357/why-is-t-bounded-by-object-in-the-collections-max-signature

반응형