我想要A
T
参数设置一个接口A<T>
,并希望每个实现它的类也实现Comparable
(T
及其子类型。写interface A<T> extends Comparable<? extends T>
似乎很自然,但这不起作用。那我该怎么办?
答案 0 :(得分:19)
当Comparable<? extends T>
出现时,表示您的Comparable
实例可以与T
的一个(未知)子类型进行比较,而不是可以与进行比较 T的子类型。
但您不需要这样,因为Comparable<T>
可以将自己与T
的任何子类型进行比较,例如Comparable<Number>
可以将自己与Comparable<Double>
进行比较。
所以试试:
interface A<T> extends Comparable<T> {
// ...
}
或
interface A<T extends Comparable<T>> extends Comparable<A<T>> {
// ...
}
取决于您是否需要能够比较T
的实例才能实施compareTo
方法。
答案 1 :(得分:2)
如果使用可比较的,则不需要在比较函数中指定子类型的可能性,本质上可以将对象X的任何子类型传递到声明类X的参数的方法中。请参阅代码以下是了解更多信息。
public interface Test<T> extends Comparable<T> {
}
class TestImpl implements Test<Number> {
@Override
public int compareTo(final Number other) {
return other.intValue() - 128;
}
}
class TestMain {
public static void main(final String[] args) {
TestImpl testImpl = new TestImpl();
testImpl.compareTo(Integer.MIN_VALUE);
}
}