Dun*_*gor 14 java generics comparable
我正在尝试编写一个需要两个Comparables 的泛型max函数.
到目前为止我有
public static <T extends Comparable<?>> T max(T a, T b) {
if (a == null) {
if (b == null) return a;
else return b;
}
if (b == null)
return a;
return a.compareTo(b) > 0 ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
这无法编译
The method compareTo(capture#5-of ?) in the type Comparable<capture#5-of ?> is not applicable for the arguments (T)
Run Code Online (Sandbox Code Playgroud)
我认为这是说,?in Comparable<?>可以被解释为参数a的一种类型,而参数b的另一种类型,因此它们无法进行比较.
我如何从这个洞中挖掘自己?
new*_*cct 28
为获得最佳效果,您应该使用public static <T extends Comparable<? super T>> T max(T a, T b).
问题<T extends Comparable<?>>在于,这表示类型T与某种类型相当,但您不知道该类型是什么.当然,常识会要求实现Comparable的类应该至少能够与其自身进行比较(即能够与自己类型的对象进行比较),但从技术上讲,没有任何东西阻止A类实现Comparable<B>,其中A和B彼此无关.<T extends Comparable<T>>解决了这个问题.
但是这有一个微妙的问题.假设类X实现Comparable<X>,并且我有一个扩展X的类Y.所以类Y Comparable<X>通过继承自动实现.Y类也无法实现,Comparable<Y>因为类不能使用不同的类型参数实现两次接口.这不是一个真正的问题,因为Y的实例是X的实例,所以Y可以与Y的所有实例相比.但问题是你不能在你的<T extends Comparable<T>> T max(T a, T b)函数中使用类型Y ,因为Y没有实现Comparable<Y>.界限太严格了.<T extends Comparable<? super T>>解决问题,因为T足以与某些超类型的T(包括所有T实例)相比较.回想一下规则PECS - 生产者extends,消费者super- 在这种情况下,Comparable是一个消费者(它需要一个对象进行比较),所以super很有意义.
这是Java库中所有排序和排序函数使用的类型边界.