您能否通过示例和挑战解释上述内容?
当然。考虑两个这样的类 - 我已经省略了所有的 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
足够聪明,仅将其日期处理应用于 的实例Person
,那么您可能期望comparison1
andcomparison2
为 0,但comparison3
不为零。
大概comparison4
必须为0,因为它正在使用NamedThing.compareTo
,它只比较名称。
从根本上说,试图比较不同类型的实例是有问题的。拥有一个比较的外部定义会更清晰,它定义了它将使用什么比较。因此,您可以有一个Comparator<Person>
只接受Person
引用并使用名称和日期的一个,以及一个Comparator<NamedThing>
只按名称比较的。该行为将具有对称性和清晰度。
你能解释一下 Joshua 所说的第二类作为第一类的实例是什么意思吗?
你已经断章取义了。它是:“将第二类的实例视为第一类的实例” - 例如
// First class = Animal
// Second class = Zebra
Animal person = new Zebra();