![](/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.