24

Java での簡単な演習として、並べ替えられたリストを実装しようとしています。汎用にするadd(Comparable obj)ために、 Comparable インターフェイスを実装する任意のクラスで使用できるようにしています。

ただし、obj.compareTo(...)コードの任意の場所で使用する"unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable"と、コンパイラから取得します (-Xlint:uncheckedオプションを使用)。コードは問題なく動作しますが、その迷惑なメッセージを取り除く方法がわかりません。

ヒントはありますか?

4

3 に答える 3

31

本質的に、この警告は、Comparableオブジェクトを任意のオブジェクトと比較できないことを示しています。Comparable<T>type パラメーターTは、このオブジェクトを比較できるオブジェクトの型を指定するジェネリック インターフェイスです。

したがって、Comparable<T>正しく使用するには、並べ替えられたリストを一般的なものにして、互いに比較できるオブジェクトをリストに格納するという制約を表現する必要があります。たとえば、次のようになります。

public class SortedList<T extends Comparable<? super T>> {
    public void add(T obj) { ... }
    ...
}
于 2011-01-28T16:19:59.040 に答える
9

メソッド パラメーターのようなインターフェイスを使用してComparableも、クラスはジェネリックにはなりません。ジェネリック型パラメーターを宣言して使用することで、クラスをジェネリックにすることができます。

簡単な答え:Comparableのような特定の型引数を与えるのではなく、ジェネリック インターフェイスである を生の型として使用しているため、警告が表示されますComparable<String>

これを修正するには、add()型パラメーターを指定してジェネリックにします。

<T extends Comparable<? super T>> add(T obj) { ... }

しかし、この簡単な修正では、クラスが安全でないという一般的な問題は修正されません。結局のところ、リスト内のすべてのオブジェクトが同じタイプであるべきではありませんか? このadd方法では、異なる型を同じリストに入れることができます。異種の型を比較しようとするとどうなりますか (インスタンスをインスタンスまたは String インスタンスと比較するにはどうすればよいでしょうか) compareTo。クラスのユーザーが正しいことを行い、リストに 1 種類だけを貼り付けるようにすることができますが、ジェネリック クラスを使用すると、コンパイラーがこの規則を適用できます。ObjectNumber

より良いアプローチ:適切な修正は、並べ替えられたリスト クラスが、.NET の他のコレクション クラスと同様に、おそらく全体的にジェネリックである必要があるということjava.utilです。

あなたはおそらく次のようなものが欲しいでしょう:

public class SortedList<T extends Comparable<? super T>>
implements Iterable<T> {
    ...
    public void add(T item) { ... }
    public Iterator<T> iterator() { ... }
    ...
}

クラスがジェネリックの場合、addメソッドは独自の仮型パラメーターを宣言するのではなく、クラスの仮型パラメーターを使用することに注意してください。

ジェネリック クラスの作成方法に関するチュートリアルは Web 上にたくさんあるはずですが、簡単な例を次に示します。

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ002

class Pair<X,Y>  {  
  private X first; 
  private Y second;
  public Pair(X a1, Y a2) { 
    first  = a1; 
    second = a2; 
  } 
  public X getFirst()  { return first; } 
  public Y getSecond() { return second; } 
  public void setFirst(X arg)  { first = arg; } 
  public void setSecond(Y arg) { second = arg; } 
}
于 2011-01-28T16:35:57.847 に答える
1

次のように Comparable オブジェクトを「チェック」または定義する必要があります。

add(Comparable<Object> obj)
于 2011-01-28T16:17:47.127 に答える