有界面

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和所有子类中相同地实现。

10-07 19:16
查看更多