簡體   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