2

次のクラスがあるとします (デモンストレーション用)。

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>。生の型を使用することは確かに「機能します」が、これは正しいアプローチですか?

4

2 に答える 2

4

問題は、1 つのインスタンスが を持ち、もう 1 つのインスタンスが をComparable<TrainA>含みComapable<TrainB>、 のcompareメソッドがComparable<TrainA>のインスタンスを受け入れないことですTrainB。これは、ワイルドカードを使用して設定したものです。

Comparableあなたのより良い賭けは、共通のスーパータイプをieに入れることです。Comparable<Toy>またはComparable<Object>

于 2011-11-14T19:34:20.993 に答える
0

trainsフィールドが typeであると宣言することComparable<?>[]で、それが特定の型の配列であると断言することになります。の 2 つの異なるインスタンスにToysetはそれぞれ、特定の typetrainsのシーケンスを保持するフィールドがありますが、それぞれが異なる特定の型を念頭に置いています。コンパイラは、インスタンス内のさまざまなフィールドを指す配列の特定の型がサブタイプまたはスーパータイプの関係を持つことを主張するコードが何もないことを警告しています。trainsToyset

この場合、生の型にフォールバックするのが正直なところです。比較されるオブジェクトのタイプについて意味のあることは何もありません。代わりに を使用してみてくださいComparable<Object>。これにより、型パラメーターの使用がかなり弱くなります。

デザインは私には奇妙に思えます。私はそれがもっと大きなものから省略されていると仮定しています。おもちゃセットを比較することができます。これは、各おもちゃセットに含まれる列車の辞書式比較に依存します。それはいいのですが、すべての列車に共通する上限型がないのはなぜですか?

于 2011-11-14T20:23:46.103 に答える