我想知道以下内容是否有有效的用例:
class Base {}
class A implements Comparable<Base> {
//...
}
接受T
类型的集合似乎是一种常见的模式(有关示例,请参阅Collections ),其中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>
不是更安全吗?或者,是否有一些用例可以验证通配符?
发布于 2016-01-14 09:43:56
约束条件
T extends Comparable<? super T>
应该理解为
T extends S, S extends Comparable<S>
Comparable
类型总是自比较的。
如果为X <: Comparable<Y>
,则X <: Y <: Comparable<Y>
必须是这种情况。
我们甚至可以从compareTo()
的合同中“证明”这一点。由于必须定义反向y.compareTo(x)
,因此Y <: Comparable<A>, X<:A
必须为真。遵循同样的论点,我们有A <: Comparable<Y>
。那么传递性将导致A=Y
。
https://stackoverflow.com/questions/34603388
复制相似问题