次のクラスがあるとします (デモンストレーション用)。
package flourish.lang.data;
public class Toyset implements Comparable<Toyset> {
private Comparable<?>[] trains;
@Override
public int compareTo(Toyset o) {
for (int i =0; i<trains.length; i++) {
if (trains[i].compareTo(o.trains[i]) < 0)
return -1;
}
return 1;
}
}
コンパイラが教えてくれる
「型のメソッドcompareTo(capture#1-of ?)
Comparable<capture#1-of ?>
は引数( )には適用できませんComparable<capture#2-of ?>
」
Comparables
列車に違いを入れたいという事実にどのように対処できますか? 確かに、パラメーターを削除して生の型を使用することもできますが、それは少し問題があるように思えます。
編集:おそらく、私が与えた例は少し鈍いです。私が理解しようとしているのは、ジェネリックを常に使用する必要があるかどうかですComparables
。たとえば、比較したいオブジェクトのクラスが実行時までわからない場合:
public class ComparisonTool {
public static int compareSomeObjects(final Class<? extends Comparable> clazz, final Object o1, final Object o2) {
return clazz.cast(o1).compareTo(clazz.cast(o2));
}
public static void main(String[] args) {
System.out.println(compareSomeObjects(Integer.class, new Integer(22), new Integer(33)));
}
}
2 つのキャスト操作が同じクラスであることが保証されていない (? のキャプチャ #1 と ? のキャプチャ #2) ため、次のように置き換えComparable
た場合、コンパイラは (上記のように) 文句を言います。Comparable<?>
一方、Comparable<Object>
どちらにも置き換えることはできません。なぜなら、呼び出しがmain()
メソッドのシグネチャと一致しないためです (つまり、Integer
実装Comparable<Integer>
ではなく) Comparable<Object>
。生の型を使用することは確かに「機能します」が、これは正しいアプローチですか?