キーと値の2つのメンバーを持つ汎用のPairクラスを作成したいと思います。このクラスの唯一の要件は、キーと値の両方がComparableインターフェイスを実装する必要があることです。そうでない場合、Pairクラスはそれらを型パラメーターとして受け入れません。
まず、次のようにコーディングします。
public class Pair<T1 extends Comparable, T2 extends Comparable>
ただし、JDK1.6コンパイラはこれに関する警告を生成します。
Comparable is a raw type. References to generic type Comparable<T> should be parameterized
次に、型パラメーターを追加しようとしましたが、コードは次のようになりました。
public class Pair<T1 extends Comparable<? extends Object>,
T2 extends Comparable<? extends Object>>
これで、Pairのコンパレータを生成しようとするまで、すべてがうまくいきます(次のコードはPairクラスにあります)
public final Comparator<Pair<T1, T2>> KEY_COMPARATOR = new Comparator<Pair<T1, T2>>() {
public int compare(Pair<T1, T2> first, Pair<T1, T2> second) {
*first.getKey().compareTo(second.getKey());*
return 0;
}
};
コードfirst.getKey().compareTo(second.getKey());
は次のようなエラーを生成します:
The method compareTo(capture#1-of ? extends Object) in the type Comparable<capture#1-of ? extends Object> is not applicable for the arguments (T1)
このエラーメッセージの意味を知っている人はいますか?
このトピックに関するヒントは大歓迎です。
更新:
完全なコードは次のとおりです。
public class Pair<T1 extends Comparable<? extends Object>, T2 extends Comparable<? extends Object>> {
private T1 key;
private T2 value;
public static int ascending = 1;
public final Comparator<Pair<T1, T2>> KEY_COMPARATOR = new Comparator<Pair<T1, T2>>() {
public int compare(Pair<T1, T2> first, Pair<T1, T2> second) {
int cmp = first.getKey().compareTo((T1)(second.getKey()));
if (cmp > 0) return ascending;
return -ascending;
}
};
}
@MarvinLabsコンパイラがオブジェクトが同じタイプの他のオブジェクトと比較されていることを確認できない理由をもう少し説明していただけますか。上記のコードでsecond.getKey()
は、と同じタイプのT1タイプを返します。first.getKey()