有界面
interface Animal extends Comparable<Animal> {
}
和2节课
class Dog implements Animal {
}
和
class Cat implements Animal {
}
当争论与
compareTo(Animal o)
的具体实现不同时,应该返回什么Animal
?它应该抛出
IllegalArgumentException
吗?例如,如果我将
Dog
实例传递给Cat.compareTo()
。我无法比较它们,因为它们是不同的类型。我不能引用super.compareTo()
,因为它们的超级类型是Object
类型,并且没有实现Comparable
。将Dog
强制转换为Cat
将抛出ClassCastException
。 最佳答案
如果您不希望interface Animal
的子类相互可比较,则不应首先实现Comparable<Animal>
。
在有效的Java 2nd Ed中,在项目8“考虑实现Comparable”中有一个相关的引用(我从my answer to this question中复制了以下内容):
[compareTo
合同]的这三个条款的结果之一是:
compareTo方法必须遵守平等合同规定的相同限制:
自反性,对称性和可传递性。因此,同样的警告适用:
没有办法用新的值组件扩展可实例化的类,而
保留compareTo合同,除非您愿意放弃
面向对象的抽象(项目8)。
因此,这就是说,假设您的子类没有比用于确定排序的超类更多的值,则实现Comparable<Supertype>
是合理的。
除了Comparable
的一般要求外,这意味着Comparable<Superclass>
应该在Superclass
和所有子类中相同地实现。