2

ソートしたいオブジェクトのリストがありますが、リストのジェネリック型がに準拠している場合に限りjava.util.Comparableます。正しいキャストが何であるかはわかりませんが:

private <T extends Widget> void doAction(Class<T> clazz, List<T> list) {
    if (Comparable.class.isAssignableFrom(clazz)) {
        Collections.sort(list);
    }
    // Do more.
}

Collections.sort実装するにはtypeパラメーターが必要なjava.util.Comparableので、すべてが機能しない次のことを試しました。

Collections.sort((List<? extends Comparable<T>>)list);
Collections.sort((List<? extends Comparable>)list);
Collections.sort((List<? extends Comparable<? super T>>)list);
Collections.sort((List<T extends Comparable<? super T>>)list);

そして他に、私は本当に推測していました。私は最初のものがうまくいっただろうと思った。

どんな援助も大歓迎です。

更新:これがどのように機能しないかを示すために、コンパイラから次のエラーが発生します。

com/mycompany/test/WidgetTest.java:[112,20] no suitable method found for sort(java.util.List<T>)
    method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
      (cannot instantiate from arguments because actual and formal argument lists differ in length)
    method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
      (inferred type does not conform to declared bound(s)
        inferred: T
        bound(s): java.lang.Comparable<? super T>)

Widgetこれは、意図されたものに準拠していませんComparableが、のサブクラスが準拠している可能性があることに注意してください。Widgetこれは、私がテストしようとしているものです。

4

2 に答える 2

2

試す

private <T extends Widget> void doAction(Class<T> clazz, List<T> list) {
    if (Comparable.class.isAssignableFrom(clazz)) {
        Collections.sort((List)list);
    }
}
于 2013-03-26T03:26:35.470 に答える
0

TはextendsWidgetとして宣言されているため、単に互換性がないため、ListをListにキャストすることはできません。

私はあなたがのように非常に醜いキャスティングをすることができると信じています、(List<Comparable>)(List)listしかしそれはとてもひどいように見えます。

ダミーを作成することをお勧めしますComparator。これにより、入力オブジェクトがComparableとしてキャストされ、直接比較が行われます。あなたが簡単にできるように Collections.sort(list, new PassThroughComparator());

于 2013-03-26T03:56:25.850 に答える