2010-07-27 7 views
2

자바에서는 제네릭을 사용하여 동일한 유형의 두 Comparable 개체를 매개 변수로 사용하고 큰 개체를 반환하는 max 함수를 만드는 방법은 무엇입니까? 제네릭을 사용하여 큰 것을 반환하는

내가 시도 :

public static <T extends Comparable> T max(T obj1, T obj2) 
{ 
    return (((obj1).compareTo(obj2) >= 0) ? obj1 : obj2); 
} 

(. 그들은 모두 동일한 경우 그것은으로 obj1 반환)

방법은 내가 http://www.informit.com/articles/article.aspx?p=170176&seqNum=3에서 찾을 코드를 기반으로합니다. (: 체크되지 않은 -Xlint로 컴파일) :

그러나 내가 그것을 컴파일 할 때 나는이 경고를 경고 : [선택 해제] 원시 형의 멤버 등은 compareTo (T)에 선택하지 않은 호출 java.lang.Comparable

답변

11

원시 형식 인 Comparable을 사용하고 컴파일러에서 compareTo가 compareable의 type 매개 변수를 사용하므로 비교 대상을 확신 할 수 없기 때문에 이러한 현상이 발생합니다. 당신이 Comparable<B>를 구현하는 클래스 B를 확장하는 클래스 A를 가질 수 있기 때문에

public static <T extends Comparable<? super T>> T max(T obj1, T obj2) 

당신은 ? super T를 사용해야하지만, A는 Comparable<A>를 구현하지 않습니다 당신은뿐만 아니라 대등 변수화 할 필요가있다. 그러면 최대 2 개의 A 객체를 전달할 수 있고 B는 ? super A과 일치하므로 A 객체의 경우에도 B에 정의 된 compareTo 메서드를 호출 할 수 있습니다. 당신이 <T extends Comparable<T>>을 사용하고 통과하려 할 경우이 A는 그들이 경고를 제거합니다 B.

+0

'Collections.max()'와 유사합니다. –

+0

대단히 감사합니다. – ladaghini

+0

@MarkPeters : Collections.max() 함수의 제네릭 부분을 설명 할 수 있습니까? 그것도 너무 혼란 스럽다. 또는 관련 링크를 제공하십시오. – IfOnly

0

public static <T extends Comparable<T>>에서 compareTo 방법을 상속에도 불구하고, 컴파일들이 Comparable<A>를 구현하지 않는 것을 불평 할 객체.

+1

불필요하게 제한적이기 때문에 훌륭한 API 선택은 아닙니다. –

관련 문제