繁体   English   中英

如果参数是同一接口的不同实现,则compareTo()应该返回什么?

[英]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进行比较。

如果只想将DogDog进行比较,则应采用以下方式进行定义:

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搜索结果数量的排序,这将是一个有效的实现。

这实际上取决于您是否想要比较猫和狗。 广义上讲,存在不同的可能性

  1. 比较所有动物实例的顺序是否等于Equal

    例如,您可以使用动物的不同属性,即两种不同的动物不能具有相同的所有属性。 如果可以的话,您可以将类别名称用作此类属性,以比较所有其他属性相同的Cat和Dog

  2. 比较所有动物实例的顺序与等于不一致

    上面的内容略有不同:如果两个动物的属性相同,则它们将比较相等 ,即使它们之间的equals将返回false。 请注意,根据Javadoc for Comparable ,它可能很危险(即使可能)。

    强烈建议(尽管不是必需的)自然顺序应与等号保持一致。 之所以如此,是因为没有显式比较器的排序集(和排序映射)与自然排序与等式不一致的元素(或键)一起使用时,其行为“奇怪”。 特别是,这样的排序集(或排序图)违反了根据equals方法定义的集合(或图)的一般约定。

  3. 仅在一个类(当然还有其子类)中比较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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM