尝试比较
形式的泛型类型时 Class<T> implements Comparable<T> {
public int compareTo(T other){
this.T < other
}
}
对我来说不起作用,但在使用时
Class<T extends Comparable<T>>{
T.compareTo(other.T)
}
确实有效。我一直无法消除为什么我不能直接使用第一个例子来比较T
答案 0 :(得分:4)
在你的第一个例子中:
class Foo<T> implements Comparable<T> {
您说Foo
个对象具有可比性。在你的第二个例子中:
class Foo<T extends Comparable<T>>{
你说的是,无论T
是什么,它都具有可比性。
然后,在您的代码正文中,您尝试比较T
类型的内容 - 在第一种情况下,您无法保证它们具有可比性,在第二种情况下,您可以做到。
答案 1 :(得分:1)
我希望这两个exmaples能够解决你的问题:
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>
(如果您不知道wildcards是什么,只需认为只有Comparable<T>
t.compareTo(anotherT)
1}}),所以你可以拨打class Car implements Comparable<Car> { ... }
class SportCar extends Car { ... }
。有关bounded type parameters的更多信息。
编辑:(Wildard解释)
请考虑以下代码:
sportCar1.compareTo(SportCar2)
现在致电Bar<SportCar>
完全合法。但是,没有通配符,
SportCar
是一个cpompile错误!
为什么呢?因为Comparable<SportCar>
没有实施T
。您需要Comparable<T>
来实施T
,在这种情况下,SportCar
为SportCar
。
但是Comparable<Car>
实现Car
而SportCar
是SportCar
的超类型。所以你想说类似于&#34; T可以与T或T&#34;的任何超类型进行比较。 (在这种情况下,Car
可以与任何{{1}}进行比较。
这是通配符的用途(在许多其他事情中)。希望这会有所帮助。