如何编写泛型方法来查找最大元素并调用该方法?

Pra*_*ate 9 java generics list

当我试图通过泛型教程Q&A解决练习时,我的答案略有不同

我的答案

public static <T extends Comparable<? super T>>
    T max(List<? extends T> list, int begin, int end) //Option1

public static <T extends Comparable<T>>
    T max(List<? extends T> list, int begin, int end) //Option2
Run Code Online (Sandbox Code Playgroud)

从下面引用的答案

所以我的问题是

  • 选项1:如果T extends Object & Comparable<? super T>替换为,会有什么不同吗T extends Comparable<? super T>?不extends Object隐含?

  • 选项2:如果Comparable<? super T>替换为它会有什么不同Comparable<T>吗?如果是这样?

  • Eclipse代码完成List<? extends Comparable<? super Comparable<? super T>>> list;在Ctrl + 1上创建局部变量,max(list, 1, 10);这有点冗长.如何定义扩展的类(层次结构)Comparable<? super T>,创建列表并将实例添加到列表并调用下面的方法?基本上我想知道如何max()在将类实例添加A or B 到列表中后调用class B extends A


编写一个通用方法来查找列表[begin,end]范围内的最大元素.

回答:

import java.util.*;

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 8

如果Comparable<? super T>更换它会有什么不同Comparable<T>吗?如果是这样?

请记住,可比较对象始终是消费者,即Comparable<T>消耗T实例,因此应始终优先使用(Comparable<? super T>而不是Comparable<T>(引用 - PECS)).如果您要比较超类实现的类型,它会有所不同Comparable<SuperType>.请考虑以下代码:

class Parent implements Comparable<Parent> {
    protected String name;

    @Override
    public int compareTo(Parent o) {
        return this.name.compareTo(o.name);
    }
}

class Child extends Parent {
    public Child(String name) {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你给你的类型参数T extends Comparable<T>,你将无法调用该方法List<Child>,因为Child没有实现,Comparable<Child>但是Comparable<Parent>:

public static <T extends Comparable<T>> T max(List<? extends T> list, int begin, int end) {
    ...
}

public static void main(String[] args) {
    List<Child> list = new ArrayList<Child>();
    max(list, 0, 2);  // Error with current method. Child does not implement Comparable<Child>
}
Run Code Online (Sandbox Code Playgroud)

因此类型参数边界应该是T extends Comparable<? super T>.

请注意,您无法将Child类更改为:

class Child extends Parent implements Comparable<Child>
Run Code Online (Sandbox Code Playgroud)

因为在这种情况下,Child类将从相同泛型类型的不同实例化扩展,这是不允许的.


如果T extends Object & Comparable<? super T>被替换它会有什么不同吗T extends Comparable<? super T>?是不是extends Object隐含?

那么,这两个界限之间存在差异.在1 的约束,类型参数的擦除是Object,而在2 结合,擦除是Comparable.

因此,无限制Object地,您的代码将编译为:

public static Comparable max(List list, int begin, int end)
Run Code Online (Sandbox Code Playgroud)

当您正在泛化遗留的非通用代码时,可能会出现此问题.还必须给出Object上限以避免破坏字节码兼容性.你可以在这个链接上阅读更多相关信息:Angelika Langer - Programming Idioms