可比性是否应该与另一种类型进行比较?
我想知道以下方面是否有有效的用例:
class Base {}
class A implements Comparable<Base> {
//...
}
接受类型的集合似乎是一种常见的模式(有关许多示例,请参阅集合),其中 .T
T extends Comparable<? super T>
但是,在与基类进行比较时,从技术上讲似乎不可能满足compareTo()
的契约,因为没有办法确保另一个类不会通过矛盾的比较来扩展基。请考虑以下示例:
class Base {
final int foo;
Base(int foo) {
this.foo = foo;
}
}
class A extends Base implements Comparable<Base> {
A(int foo) {
super(foo);
}
public int compareTo(Base that) {
return Integer.compare(this.foo, that.foo); // sort by foo ascending
}
}
class B extends Base implements Comparable<Base> {
B(int foo) {
super(foo);
}
public int compareTo(Base that) {
return -Integer.compare(this.foo, that.foo); // sort by foo descending
}
}
我们有两个类使用不遵循通用规则的比较进行扩展(如果有通用规则,它几乎肯定会在 中实现)。然而,以下破碎的排序将编译:Base
Base
Collections.sort(Arrays.asList(new A(0), new B(1)));
只接受不是更安全吗?或者是否有一些用例可以验证通配符?T extends Comparable<T>