2011-12-20 4 views
2

私は次のインラインコンパレータを持っています。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>


そして、私は型チェックを行う場合:私は、エラーメッセージのアドバイスに従うならば、

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<SampleClass>) { 
     return ((Comparable<SampleClass>)o1).compareTo (o2); 

を私は次のエラーを取得します:

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)


今、私はprocedeする方法がわからないが、私は本当にの警告およびエラーフリーのあるコードをprefere。 どのようにして、警告のないコードを作成したいのですか?

+0

をお試しください:O1が同等であるとo2がない場合はどうなりますか?どちらもComparableではないようです。 – oers

答えて

4

問題は、実行していることが安全であることをコンパイラが知る方法がないことです。代わりに、あなたはあなたが何をしているか知っている信頼する必要があり、あなたは彼メソッドやクラスTOTこの注釈

@SuppressWarnings("unchecked") 

を追加することができ、警告が消えます。

+0

さて、これは動作します。しかし、私はいつも '@ SuppressWarnings'を少し醜いと思っていましたが、それは私の最後の手段です。あなたが言うように、おそらくもっと良い方法はありません。 –

+2

あなたは言語/ライブラリを誤って使用しようとしているので、醜さは自発的です: 'SampleClass'は' Comparable'を実装すべきです、そして 'instanceof'もキャストも必要ありません。あるいは、あなたは、「相似」すなわち交換可能かつ推移的な部分の契約に違反します。きれいになるためには、元に戻って全体的な画像やいくつかのピクセルについて考える必要はありません。 –

+0

実際、私の場合、実際のコードは巨大なレガシーアプリケーションの中にあり、全体像を見えにくくしています。 –

0

はサイドノートでは

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

タイプの安全性:「SampleClass」から「Comparable 」へのチェックされていないキャスト –

+0

SampleClassはComparableを実装していますか? –

+0

Traxdata:いくつかのサブクラスがあります。 –

関連する問題