9

すべて共通の属性を共有する一連のクラスがあるため、それらすべてを共通の基本クラスBaseEntity. だから私は、例えばFoo extends BaseEntityとを持っていBar extends BaseEntityます。

FooこれらとオブジェクトのリストもBarソート可能にしたいので、実装しComparableました。と として定義されたクラスがFoo extends BaseEntity implements Comparable<Foo>あり、 s またはs のBar extends BaseEntity implements Comparable<Bar>リストのソートは期待どおりに機能します。もちろん、ソートの詳細はサブクラスごとに異なります。しかし、s とs のどちらを持っているかが事前にわからない場合、並べ替えを機能させる方法を見つけることができません。たとえば、次のコードはコンパイルに失敗します。FooBarFooBar

public class UtilityClass<T extends BaseEntity> {

  ...bunch of stuff...

  List<T> values;

  public List<T> sort() {
    Collections.sort(values);
    return values;
  }

  ...more methods...
}

エラーメッセージ付きBound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<T>). The inferred type T is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>

BaseEntity問題は、オブジェクトのリストをソートしようとしていて、BaseEntityそれ自体が実装していないことだと思いますComparable。しかし今、私は問題に直面しています: オブジェクトを他のオブジェクトと比較できるようにする唯一の賢明なことはBaseEntity、他のオブジェクトBaseEntityです.禁止されている。implements Comparable<BaseEntity>BaseEntityFooComparable<BaseEntity>Comparable<Foo>

implements Comparable<Foo>を削除してを実装するだけでこの問題を回避できることはわかっていますComparable<BaseEntity>が、その場合、私のcompareToメソッドは醜いキャストを行う必要があります。

私が本当にやりたいことは、BaseEntityそのすべてのサブクラスが になることを署名で指定することですComparableが、同じサブクラスのインスタンスに対してのみです。

感謝して受け取った支援。ありがとう!

4

4 に答える 4

8

次のように交差タイプを使用します。

public class MyList<T extends BaseEntity & Comparable<T>> {...}

これは、T が aBaseEntity Comparableそれ自体の両方でなければならないことを指定します。

于 2013-01-29T07:49:50.923 に答える
2

使用せずCollections.sort(List<T>)Collections.sort(Lst<T>, Comparator<? extends T>)代わりに使用してください。コンパレータに比較コードを記述します。

于 2013-01-29T07:58:02.320 に答える
1

これを試して:

static <T extends Comparable<? super T>> sort(T[] array);

これは、タスクを達成するための最も一般的な仕様です。基本的に、T はそれ自体と比較できる型であると主張します。

于 2013-01-29T07:47:12.173 に答える