メソッド パラメーターのようなインターフェイスを使用してComparable
も、クラスはジェネリックにはなりません。ジェネリック型パラメーターを宣言して使用することで、クラスをジェネリックにすることができます。
簡単な答え:Comparable
のような特定の型引数を与えるのではなく、ジェネリック インターフェイスである を生の型として使用しているため、警告が表示されますComparable<String>
。
これを修正するには、add()
型パラメーターを指定してジェネリックにします。
<T extends Comparable<? super T>> add(T obj) { ... }
しかし、この簡単な修正では、クラスが安全でないという一般的な問題は修正されません。結局のところ、リスト内のすべてのオブジェクトが同じタイプであるべきではありませんか? このadd
方法では、異なる型を同じリストに入れることができます。異種の型を比較しようとするとどうなりますか (インスタンスをインスタンスまたは String インスタンスと比較するにはどうすればよいでしょうか) compareTo
。クラスのユーザーが正しいことを行い、リストに 1 種類だけを貼り付けるようにすることができますが、ジェネリック クラスを使用すると、コンパイラーがこの規則を適用できます。Object
Number
より良いアプローチ:適切な修正は、並べ替えられたリスト クラスが、.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; }
}