すべて共通の属性を共有する一連のクラスがあるため、それらすべてを共通の基本クラス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 のどちらを持っているかが事前にわからない場合、並べ替えを機能させる方法を見つけることができません。たとえば、次のコードはコンパイルに失敗します。Foo
Bar
Foo
Bar
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>
BaseEntity
Foo
Comparable<BaseEntity>
Comparable<Foo>
implements Comparable<Foo>
を削除してを実装するだけでこの問題を回避できることはわかっていますComparable<BaseEntity>
が、その場合、私のcompareTo
メソッドは醜いキャストを行う必要があります。
私が本当にやりたいことは、BaseEntity
そのすべてのサブクラスが になることを署名で指定することですComparable
が、同じサブクラスのインスタンスに対してのみです。
感謝して受け取った支援。ありがとう!