2008-09-12 10 views
18

내가 자바 1.5를 사용하는 응용 프로그램을 변환하고있어 다음과 같은 방법을 발견했다 :제네릭을 사용하도록 다음 코드를 변환 할 수 있습니까?

/** 
    * Compare two Comparables, treat nulls as -infinity. 
    * @param o1 
    * @param o2 
    * @return -1 if o1<o2, 0 if o1==o2, 1 if o1>o2 
    */ 
    protected static int nullCompare(Comparable o1, Comparable o2) { 
    if (o1 == null) { 
     if (o2 == null) { 
     return 0; 
     } else { 
     return -1; 
     } 
    } else if (o2 == null) { 
     return 1; 
    } else { 
     return o1.compareTo(o2); 
    } 
    } 

가 이상적으로이 방법은 같은 종류의 두 비교 대상을하고 싶습니다를 가능이를 변환하는 방법 ?

protected static <T extends Comparable> int nullCompare(T o1, T o2) { 

하지만이 원시 형의 멤버로 '은 compareTo (T)'인 IntelliJ "에 체크되지 않은 호출에 경고를 제거하는 데 실패했다 '자바 :

은 내가 트릭을 할 것입니다 다음과 같은 생각

return o1.compareTo(o2); 

답변

21

변경 그것에 : 라인에 .lang.Comparable '는 "

protected static <T extends Comparable<T>> int nullCompare(T o1, T o2) { 

당신이 필요로하는 Compara 때문에 ble 자체는 일반적인 유형입니다.

+0

아아! 나는 그것이 가까이에 있었다는 것을 믿을 수 없다. –

+0

이것은 모두를 위로 여행한다. – jodonnell

+0

T가 Comparable 인게 맞습니까? T가 비슷한 이 더 정확할 것 같습니다? – cletus

5

여기 홀수 사건 :

static class A { 
    ... 
} 

static class B extends A implements Comparable<A> { 
    public int compareTo(A o) { 
     return ...; 
    } 
} 

다행히도 코드 한 상기 드물지만는 필적이 에서 t 적용 또는 수퍼 이의 수 언급하지 않는 nullCompare()는 B들의 비교를 지원하지 않는 것처럼 :

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) { 

수출 라이브러리 API를 설계 할 때 대부분의 사람들이 위의 팅겨 혜택을하지 않습니다하더라도, 그것은 편리하게 사용할 수 있습니다.

0

이 방법을 일반화하는 것이 이치에 맞는지 확실하지 않습니다. 현재이 메서드는 모든 종류의 Comparable에서 작동합니다. 당신이 그것을 일반화한다면 당신은 그것을 정확히 (같은 코드로) 여러 번 구현해야 할 것입니다. 때로는 공통 조상이없는 두 객체를 비교하는 것이 가능하며 일반 버전에서는이를 허용하지 않습니다.

제네릭을 추가하면 코드에 안전성을 추가하지 않습니다. compareTo에 대한 호출에서 안전 문제가 발생합니다. 내가 제안하는 것은 단순히 경고를 억제하는 것입니다. 유용하다는 것을 경고하지는 않습니다.

2

편집 할 수 없으므로 답변을 게시해야합니다.

Comparable이 generic이므로 중첩 형식 매개 변수를 선언해야합니다.

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) { 

대등 <을 유의하시기 바랍니다? super T>, 더 유연합니다. 당신은 심지어 두 개의 서로 다른 종류의 작업을 허용 할 수 있습니다, 그것은 더 일반적으로 만들려면은, Collections.sort

public static <T extends Comparable<? super T>> void sort(List<T> list) { 
0

에 같은 방법으로 정의를 볼 수 있습니다. = P

/** 
    * Compare two Comparables, treat nulls as -infinity. 
    * @param o1 
    * @param o2 
    * @return -1 if o1&lt;o2, 0 if o1==o2, 1 if o1&gt;o2 
    */ 
    protected static <T> int nullCompare(Comparable<? super T> o1, T o2) { 
    if (o1 == null) { 
     if (o2 == null) { 
     return 0; 
     } else { 
     return -1; 
     } 
    } else if (o2 == null) { 
     return 1; 
    } else { 
     return o1.compareTo(o2); 
    } 
    }