[英]Java Comparable for Generic Types
嘗試比較表單中的泛型類型時
Class<T> implements Comparable<T> {
public int compareTo(T other){
this.T < other
}
}
對我不起作用,但是在使用時
Class<T extends Comparable<T>>{
T.compareTo(other.T)
}
確實有效。 我無法用第一個例子解釋為什么我不能直接比較T
在第一個示例中:
class Foo<T> implements Comparable<T> {
您是說Foo
對象具有可比性。 在第二個示例中:
class Foo<T extends Comparable<T>>{
您是說無論T
是可比的。
然后,在代碼正文中,您嘗試比較T
類型的事物-在第一種情況下,您不能保證它們具有可比性,在第二種情況下,您可以做得到。
我希望這兩個例子可以為您的問題提供一些啟示:
class Foo<T> implements Comparable<T> {
@Override
public int compareTo(T o) {
// We don't know anything about T
return hashCode() - o.hashCode();
}
}
class Boo<T extends Comparable<? super T>> implements Comparable<T> {
private T instance;
@Override
public int compareTo(T o) {
// We know that T implements Comparable<? super T>
return instance.compareTo(o);
}
}
在Foo
第一種情況下,您對T
類型一無所知,因此您不能在compareTo()
方法中做太多事情。
但是,在Boo
,需要T
來實現Comparable<? super T>
Comparable<? super T>
(如果您不知道通配符是什么,只需認為那里只是Comparable<T>
),因此可以調用t.compareTo(anotherT)
。 有關有界類型參數的更多信息。
編輯:(對野生動物的解釋)
考慮以下代碼:
class Car implements Comparable<Car> { ... }
class SportCar extends Car { ... }
現在調用sportCar1.compareTo(SportCar2)
是完全合法的。 但是,沒有通配符, Bar<SportCar>
是一個錯誤!
為什么? 因為SportCar
沒有實現Comparable<SportCar>
。 並且您需要T
來實現Comparable<T>
,在這種情況下, T
是SportCar
。
但是SportCar
實現Comparable<Car>
而Car
是SportCar
的超類型。 因此,您想說些類似“可以將T與T或任何T的超類型進行比較”(例如,在這種情況下, SportCar
可以與任何Car
進行比較)。
這就是通配符的用途(在許多其他事情中)。 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.