[英]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.