これが私が今やっている方法です。これは、次のようになるのと同じくらいエレガントだと思います。
public abstract class ParentClass implements Comparable<ParentClass> {
// compareTo(ParentClass) is implicitly abstract
}
public class SubClass1 extends ParentClass /* Comparable<> is implicitly implemented */ {
@Override
public int compareTo(ParentClass another) {
SubClass1 subAnother = (SubClass1) another;
return /* result of sub-class comparison */;
}
}
public class MyComparator implements Comparator<ParentClass> {
@Override
public int compare(ParentClass lhs, ParentClass rhs) {
// Are lhs and rhs instances of the same sub-class?
if(!lhs.getClass().equals(rhs.getClass()))
// They are different. Use parent class comparison.
return /* result of parent class comparison */;
// They are the same. Use sub-class comparison.
return lhs.compareTo(rhs);
}
}
次に、 のインスタンスを に渡すだけMyComparator
ですTreeMap
。異なるサブクラスの比較を処理するか、サブクラスが同じ場合は比較をサブクラスに渡します。
私が気に入らないのは、別のサブクラスのインスタンスである場合SubClass1.compareTo()
にスローされることです。ただし、サブクラスが によってのみ比較されることを確認する限り、これについて心配する必要はありません。ClassCastException
another
MyComparator