有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;
    }
}
  1. 为什么方法类型参数<T extends Object & Comparable<? super T>> T必须同时扩展ObjectComparable。如果只是一个问题,又会有什么不同呢 <T extends Comparable<? super T>>
  2. 为什么Comparable<? super T>的类型参数不能只是Comparable<T>
  3. 如果List的type参数只是List<T>而不是List<? extends T>,那么会有什么区别

共 (1) 个答案

  1. # 1 楼答案

    1. 在大多数情况下,Object在这里是多余的。有关更多信息,请参见this post

    2. 如果只将其约束为T extends Comparable<T>,这意味着如果我有一个Dog可以与任何AnimalDog implements Comparable<Animal>)进行比较,并且我希望该方法在Dog的列表中为我提供“最大值”Dog(我应该能够这样做),该方法将返回一个AnimalT不能是Dog,因为Dog不实现Comparable<Dog>

      Comparable<? super T>允许使用实现Comparable<SomeSuperclassOfT>T

    3. 这类似于2。如果你成功了List<T>,那么我就不能给你一个List<Dog>并要求你返回一个AnimalT如果我通过了List<Dog>,就不能是Animal)。然而,据我所知,这在实践中并没有太大影响,因为如果需要,我仍然可以将返回的Dog转换为Animal。像这样使用通配符也是一种coding convention。这里的列表就像一个生产者(为我们生成元素以进行比较),所以我们应该使用? extends通配符。(见PECS