2011-01-28 5 views
18

ソート済みリストをJavaの簡単な練習として実装しようとしています。 genericにするにはadd(Comparable obj)があるので、Comparableインターフェイスを実装しているどのクラスでも使用できます。Java "未処理の型のメンバーとしてcompareTo(T)のチェックされていない呼び出しjava.lang.Comparable"

しかし、コード内のどこでもobj.compareTo(...)を使用すると、コンパイラ(-Xlint:uncheckedオプション付き)から"unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable"が得られます。コードはうまく動作しますが、その迷惑なメッセージを取り除く方法を理解できません。

ヒントあなたは「チェック」またはそのような比較可能なオブジェクトを定義する必要があり

答えて

22

を、この警告はComparableオブジェクトは任意のオブジェクトと比較することはできませんと言っています。 Comparable<T>は汎用インタフェースです。タイプパラメータTは、このオブジェクトを比較できるオブジェクトのタイプを指定します。

ので、正しくComparable<T>を使用するために、あなたはあなたのリストには、相互に比較することができるオブジェクトを格納制約を表現するために、あなたのソートされたリストは、一般的なようにする必要があり、このような何か:

public class SortedList<T extends Comparable<? super T>> { 
    public void add(T obj) { ... } 
    ... 
} 
+4

があるべき 'Tは' Comparableを拡張します。 – ColinD

+0

さて、以前と同じように試してみました。 – 3mpty

1

:本質的には

add(Comparable<Object> obj) 
9

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

クイック-N-汚い答え:あなたはComparable<String>のように、生タイプとして、一般的なインタフェースである、Comparableを使用して、というよりも、それを特定の型の引数を与えているので、あなたは警告を受けています。

型パラメータを指定することによってadd()は、一般的な作り、これを修正するには、次の

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

しかし、このクイックフィックスは、あなたのクラスは安全ではない一般的な問題を解決しません。結局のところ、リスト内のすべてのオブジェクトが同じタイプであるべきではないのですか?このaddメソッドを使用すると、同じリストに異なるタイプを残すことができます。異種型を比較しようとするとどうなりますか(compareTo インスタンスをNumberインスタンス、またはStringインスタンスにどのようにしますか)あなたは、クラスのユーザに依存して正しいことを行い、あなたのリストに1種類のものしか置かないようにすることができますが、ジェネリッククラスはコンパイラにこのルールを適用させます。

より良いアプローチ:適切な修正あなたのソートされたリストのクラスはおそらくjava.util内の他のコレクションクラスのように、全体的に一般的なことがなければならないということです。

あなたでしょう、おそらくのようなもののように:クラスはジェネリックであるとき、add方法は、独自の仮型パラメータを宣言するのではなく、クラスの仮型パラメータを使用していることを

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

注意。

はジェネリッククラスを作成する方法については、ウェブ上のチュートリアルがたくさんあるはずですが、ここでは簡単な例だ:

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; } 
} 
関連する問題