すべて共通の属性を共有する一連のクラスがあるため、それらすべてを共通の基本クラス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が、同じサブクラスのインスタンスに対してのみです。
感謝して受け取った支援。ありがとう!