oracle JAVA文档中的通用代码片段说明
以下代码段来自oracle文档: 我对语法有一些疑问。需要适当和详细的解释
编写一个通用方法来查找列表[开始,结束]范围内的最大元素。
public final class Algorithm {
public static <T extends Object & Comparable<? super T>>
T max(List<? extends T> list, int begin, int end) {
T maxElem = list.get(begin);
for (++begin; begin < end; ++begin)
if (maxElem.compareTo(list.get(begin)) < 0)
maxElem = list.get(begin);
return maxElem;
}
}
- 为什么方法类型参数
<T extends Object & Comparable<? super T>>
T
必须同时扩展Object
和Comparable
。如果只是一个问题,又会有什么不同呢<T extends Comparable<? super T>>
李> - 为什么
Comparable<? super T>
的类型参数不能只是Comparable<T>
李> - 如果List的type参数只是
List<T>
而不是List<? extends T>
,那么会有什么区别李>
# 1 楼答案
在大多数情况下,
Object
在这里是多余的。有关更多信息,请参见this post如果只将其约束为
T extends Comparable<T>
,这意味着如果我有一个Dog
可以与任何Animal
(Dog implements Comparable<Animal>
)进行比较,并且我希望该方法在Dog
的列表中为我提供“最大值”Dog
(我应该能够这样做),该方法将返回一个Animal
T
不能是Dog
,因为Dog
不实现Comparable<Dog>
说
Comparable<? super T>
允许使用实现Comparable<SomeSuperclassOfT>
的T
这类似于2。如果你成功了
List<T>
,那么我就不能给你一个List<Dog>
并要求你返回一个Animal
(T
如果我通过了List<Dog>
,就不能是Animal
)。然而,据我所知,这在实践中并没有太大影响,因为如果需要,我仍然可以将返回的Dog
转换为Animal
。像这样使用通配符也是一种coding convention。这里的列表就像一个生产者(为我们生成元素以进行比较),所以我们应该使用? extends
通配符。(见PECS)