2011-12-20 2 views
2

다음 인라인 Comparator가 있습니다.java의 Typechecking 및 generics가 경고를 생성합니다.

Comparable is a raw type. References to generic type Comparable<T> should be parameterized


그리고 제안 내가 대신 유형을 매개 변수화하는 경우 : 다음과 같은 경고를 생성

private static class SampleSorter implements Comparator<SampleClass>{ 
    public int compare(SampleClass o1, SampleClass o2) { 
     if (o1 instanceof Comparable) { 
      return ((Comparable) o1).compareTo(o2); 
     } else if (o2 instanceof Comparable) { 
      return -((Comparable) o2).compareTo(o1); 
     } 
     return 0; 
    } 
} 

 if (o1 instanceof Comparable) { 
      return ((Comparable<SampleClass>) o1).compareTo(o2); 

가 그럼 난 경고를 얻을 ...

Type safety: Unchecked cast from SampleClass to Comparable<SampleClass>


내가 유형 검사 할 경우 : 나는 오류 다음 얻을

if (o1 instanceof Comparable<SampleClass>) { 
     return ((Comparable<SampleClass>)o1).compareTo (o2); 

을 :

Cannot perform instanceof check against type Comparable<SampleClass> . Use the form Comparable<?> instead since generic type information will be erased at runtime


그리고 다시, 나는 오류 메시지의 조언을 따르는 경우 :

if (o1 instanceof Comparable<?>) { 
     return ((Comparable<?>)o1).compareTo (o2); 

는이 오류를 얻을 :


The method compareTo(capture#4-of ?) in the type Comparable<capture#4-of ?> is not applicable for the arguments (SampleClass)

지금 내가 것이며 진행하는 방법을 몰라, 내가 경고 - 오류없는 정말 prefere 코드입니다. 원하는 동작으로 경고없는 코드를 생성하려면 어떻게합니까?

+0

을 시도해보십시오 O1는 비교할와 O2가없는 경우 어떻게됩니까? 둘 모두 Comparable이 될 수없는 것 같습니다. – oers

답변

4

당신이 가진 문제는 컴파일러가 무슨 일을하는 것이 안전하다는 것을 알 수있는 방법이 없습니다. 대신 당신은 당신이 무엇을하고 있는지 알고 신뢰해야하고 당신은 그 방법이나 클래스 어린 아이이 주석

@SuppressWarnings("unchecked") 

을 추가 할 수 있으며 경고 멀리 이동합니다.

+0

네, 이거 작동합니다. 그러나 나는 항상'@ SuppressWarnings'를 약간 추한 것으로 생각했으며 그것은 나의 최후의 수단이 될 것입니다. 아마도 당신이 말하는 것처럼 더 좋은 방법은 없을 것입니다. –

+2

어쨌든 언어/libs를 오용하려고하기 때문에, 추악 함은 자해입니다 :'SampleClass'는'Comparable'을 구현해야합니다. 그러면 여러분은'instanceof' 나 캐스트를 필요로하지 않습니다. 또는 당신은 'Comparable'즉 교환 가능하고 이행적인 부분의 계약을 위반합니다. 깨끗하게 되려면 뒤로 물러나서 전체적인 그림을 생각해 봐야하며 일부 픽셀에 대해서는 생각하지 않아야합니다. –

+0

사실, 실제 코드는 전반적인 그림을보기가 힘든 거대한 레거시 애플리케이션 내에 있습니다. –

0

는 보조 노트에

if (o1 instanceof Comparable<?>) { 
     return ((Comparable<SampleClass>)o1).compareTo (o2); 
+0

유형 안전성 : 'SampleClass'에서'Comparable '으로의 체크되지 않은 캐스트 –

+0

SampleClass가 Comparable을 구현합니까? –

+0

Traxdata : 일부 하위 클래스가 있습니다. –