首页 > 解决方案 > 如果参数是同一接口的不同实现, compareTo() 应该返回什么?

问题描述

有接口

interface Animal extends Comparable<Animal> {
}

和2个班

class Dog implements Animal {

}

class Cat implements Animal {

}

compareTo(Animal o)当争论不是相同的具体实现时应该返回什么Animal

它应该扔IllegalArgumentException吗?

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

标签: javainterfacecomparable

解决方案


interface AnimalComparable<Animal>如果您不希望其子类具有相互可比性,则不应首先实施。

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

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

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

除了 的一般要求之外,这Comparable意味着Comparable<Superclass>应该在Superclass所有子类中以相同的方式实现。


推荐阅读