如果参数是同一个接口的不同实现,compareTo()返回什么?

ble*_*one 0 java interface comparable

有接口

interface Animal extends Comparable<Animal> {
}
Run Code Online (Sandbox Code Playgroud)

和2个班级

class Dog implements Animal {

}
Run Code Online (Sandbox Code Playgroud)

class Cat implements Animal {

}
Run Code Online (Sandbox Code Playgroud)

compareTo(Animal o)当争论不是同一个具体实施时应该返回什么Animal

应该扔IllegalArgumentException吗?

例如,如果我将Dog实例传递给Cat.compareTo().我无法比较它们,因为它们是不同的类型.我不能称super.compareTo()他们的超级是Object没有实现的类型Comparable.铸造DogCat会抛出ClassCastException.

And*_*ner 5

interface AnimalComparable<Animal>如果您不希望其子类可以相互比较,则不应该首先实现.

在第8项"考虑实现Comparable"中有一个来自Effective Java 2nd Ed的相关引用(我从这个问题的答案中复制了以下大部分内容):

[ compareTo合同] 这三个条款的一个结果是,compareTo方法所施加的相等性测试必须遵守等于合同所施加的相同限制:反身性,对称性和及物性.因此,同样的警告适用:除非您愿意放弃面向对象抽象的好处(第8项),否则无法在保留compareTo契约的情况下使用新值组件扩展可实例化类.

所以,这就是说,如果你的子类没有比用于确定排序的超类更多的值,那么实现Comparable<Supertype>是合理的.

除了一般要求之外,其含义ComparableComparable<Superclass>应该在Superclass所有子类中以相同的方式实现.