上記の例と課題を説明していただけますか?
もちろん。次のような 2 つのクラスを考えてみましょう。getter や setter などはすべて省略しましたが、うまくいけばドリフトが得られます。
class NamedThing {
String name;
}
class Person extends NamedThing {
Date dateOfBirth;
}
これが継承の良い例かどうかは無視してください。単純なものです。
NamedThing
名前に基づいてアルファベット順に比較を実装するのは自然なことです。
Person
また、最初に名前を比較する比較を実装するのも自然です(したがって、その点で一貫性が保たれます) が、次にある生年月日が別の生年月日よりも古いかどうかもチェックします。
これを想像してみてください:
NamedThing person1 = new Person("Jon", date1);
NamedThing person2 = new Person("Jon", date2);
NamedThing thing = new NamedThing("Jon");
int comparison1 = person1.compareTo(thing);
int comparison2 = person2.compareTo(thing);
int comparison3 = person1.compareTo(person2);
int comparison4 = thing.compareTo(person1);
これらすべての結果をどのようにしたいですか? がその日付処理を のインスタンスにのみPerson.compareTo
適用するほどスマートである場合、およびは 0 であると予想されるかもしれませんが、ゼロではありません。Person
comparison1
comparison2
comparison3
名前のみを比較するを使用しているため、おそらく0 にするcomparison4
必要があります。NamedThing.compareTo
基本的に、異なるタイプのインスタンスを比較しようとすると問題があります。使用する比較を定義する、比較の外部定義を持つ方がよりクリーンになります。したがって、参照Comparator<Person>
のみを受け入れPerson
、名前と日付の両方を使用するComparator<NamedThing>
と、名前のみで比較する を作成できます。動作には対称性と明瞭性があります。
また、ジョシュアがファーストクラスのインスタンスとしてセカンドクラスを意味することを説明できますか?
あなたはそれを文脈から外しました。それは次のとおりです:「2番目のクラスのインスタンスを最初のクラスのインスタンスとして表示する」-例
// First class = Animal
// Second class = Zebra
Animal person = new Zebra();