![](/img/trans.png)
[英]What should int compareTo() return when the parameter string is null?
[英]What should compareTo() return if argument is different implementation of the same interface?
有界面
interface Animal extends Comparable<Animal> {
}
和2节课
class Dog implements Animal {
}
和
class Cat implements Animal {
}
如果争论与Animal
具体实现不同,应该返回什么compareTo(Animal o)
?
它应该抛出IllegalArgumentException
吗?
例如,如果我将Dog
实例传递给Cat.compareTo()
。 我无法比较它们,因为它们是不同的类型。 我不能引用super.compareTo()
因为它们的super是没有实现Comparable
Object
类型。 将Dog
投射到Cat
会抛出ClassCastException
。
interface Animal
不应该被执行Comparable<Animal>
在第一个地方,如果你不希望它的子类是相互比较。
在有效的Java 2nd Ed中 ,在第8项“考虑实现Comparable”中有一个相关的引用(我从对这个问题的回答中复制了以下内容):
[
compareTo
契约]的这三个规定的结果是,compareTo方法施加的相等性测试必须服从平等契约所施加的相同限制:自反性,对称性和可传递性。 因此,同样的警告也适用:在保留compareTo协定的同时,无法用新的值组件扩展可实例化的类,除非您愿意放弃面向对象抽象的好处(第8项)。
因此,这就是说, 如果您的子类没有比用于确定ordering的超类更多的值 ,则实现Comparable<Supertype>
是合理的。
除了对Comparable
的一般要求外,其含义是,应该在Superclass
和所有子类中以相同的方式实现Comparable<Superclass>
。
当您将Ainimal
定义为:
interface Animal extends Comparable<Animal> {
}
您的意思是任何Animal
都可以与其他Animal
进行比较。
如果只想将Dog
与Dog
进行比较,则应采用以下方式进行定义:
interface Animal {
}
class Dog implements Animal, Comparable<Dog> {
@Override
public int compareTo(Dog o) {
...
}
}
在comparable
接口只规定一些事情是如何协同工作以“等于”,例如, compateTo()
是否应该返回0, equals
返回0 https://docs.oracle.com/javase/8/docs/api/index .html?java / lang / Comparable.html
所以实际上这取决于。 如果对您的程序有意义,则可以转换为Animal
:
int compareTo(Dog o)
{
Animal other = (Animal) o;
...
}
因此,如果您想通过使用compareTo
来对Animal进行大小或Google搜索结果数量的排序,这将是一个有效的实现。
这实际上取决于您是否想要比较猫和狗。 广义上讲,存在不同的可能性
比较所有动物实例的顺序是否等于Equal
例如,您可以使用动物的不同属性,即两种不同的动物不能具有相同的所有属性。 如果可以的话,您可以将类别名称用作此类属性,以比较所有其他属性相同的Cat和Dog
比较所有动物实例的顺序与等于不一致
上面的内容略有不同:如果两个动物的属性相同,则它们将比较相等 ,即使它们之间的equals
将返回false。 请注意,根据Javadoc for Comparable ,它可能很危险(即使可能)。
强烈建议(尽管不是必需的)自然顺序应与等号保持一致。 之所以如此,是因为没有显式比较器的排序集(和排序映射)与自然排序与等式不一致的元素(或键)一起使用时,其行为“奇怪”。 特别是,这样的排序集(或排序图)违反了根据equals方法定义的集合(或图)的一般约定。
仅在一个类(当然还有其子类)中比较Animal实例。 在这种情况下,应该将接口的声明更改为使用泛型:
interface Animal<T> extends Comparable<T> { }
和2节课
class Dog implements Animal<Dog> { }
和
class Cat implements Animal<Cat> { }
它应该引发不匹配错误,如果可能的话,在比较之前使用instanceOf运算符匹配相关对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.