java - 如果参数是同一接口的不同实现, 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
。铸造Dog
到Cat
将抛出ClassCastException
。
解决方案
interface Animal
Comparable<Animal>
如果您不希望其子类具有相互可比性,则不应首先实施。
Effective Java 2nd Ed的第 8 项“考虑实现 Comparable”中有一个相关的引用(我从我对这个问题的回答中复制了以下大部分内容):
[合约的] 这三个条款的一个结果
compareTo
是, compareTo 方法施加的相等性测试必须遵守 equals 合约施加的相同限制:自反性、对称性和传递性。因此,同样的警告也适用:除非您愿意放弃面向对象抽象的好处(第 8 项),否则无法在保留 compareTo 合同的同时使用新的值组件扩展可实例化类。
所以,这就是说,如果您的子类没有比用于确定 ordering 的超类更多的值,那么实现Comparable<Supertype>
是合理的。
除了 的一般要求之外,这Comparable
意味着Comparable<Superclass>
应该在Superclass
所有子类中以相同的方式实现。
推荐阅读
- wordpress - 如何使用 Alexa 技能从 WordPress 制作的网站中获取内容?
- ajax - 如何检查ajax resonse是对象还是简单字符串
- c++ - 使用 std::reference_wrapper
在构造函数中处理 const T& - 合适吗? - html - 定位固定的元素而不将其从文档流中移除
- javascript - 用于生产和登台的不同样式表
- azure - 后端在其他服务器上时重定向 Azure Active Directory 应用程序注册的 URI
- rcpp - 在 R 中运行 rcpp created 函数时,如何知道代码中的哪一行导致错误?
- javascript - 是否有任何选项可以通过 php 表单提交获取 typeahead.js 值?
- docker - 无法下载基础镜像
- surface - 如何在 3D 中使用 Delaunay tiangulation 获得三角形以进行表面重建?