メソッドパラメータとして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; }
}
があるべき 'Tは super T>' Comparableを拡張します。 – ColinD
さて、以前と同じように試してみました。 – 3mpty