java - 如何编写通用方法来查找最大元素并调用该方法?

标签 java list generics

当我试图解决练习时 from generics tutorial 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

来自下面引用的答案

所以我的问题是

  • 选项 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


Write a generic method to find the maximal element in the range [begin, end) of a list.

Answer:

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;
    }
}

最佳答案

Would it make any difference if Comparable<? super T> is replaced with Comparable<T> ? if so How ?

请记住,Comparables 始终是消费者,即 Comparable<T>消耗 T实例,因此最好始终使用 Comparable<? super T>而不是 Comparable<T> (引用 - PECS)。如果您正在比较其父类(super class)实现 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;
    }
}

现在,如果您将类型参数设为 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>
}

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

请注意,您不能将您的 Child 类更改为:

class Child extends Parent implements Comparable<Child>

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


Would it make any difference if T extends Object & Comparable<? super T> is replaced with T extends Comparable<? super T>. Isn't extends Object implicit ?

嗯,这两个边界是有区别的。在第 1st 绑定(bind)中,类型参数的删除是 Object ,而在 2nd 边界中,删除是 Comparable .

所以,没有 Object绑定(bind),您的代码将编译为:

public static Comparable max(List list, int begin, int end)

当您生成遗留的非通用代码时,问题可能会出现。有必要给Object也作为上限以避免破坏字节码兼容性。您可以在此链接上阅读更多相关信息:Angelika Langer - Programming Idioms

关于java - 如何编写通用方法来查找最大元素并调用该方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18411527/

相关文章:

java - 如何通过Hibernate保存正确的鉴别器值

Java 泛型 - 有界类型参数

c# - 基于同一定义中其他类型参数的通用类型参数约束

java.security.spec.InvalidKeySpecException : java. security.InvalidKeyException : IOException : DER input, 整数标记错误

JavaFX LineChart 在高值处显示空白

java - 如何在 android 的异步函数中连续接收 UDP?

c# - 如果我 'overwrite' 一个 List 和一个 'new' List,旧的被删除了吗?

具有多个列表和 if else 条件的 Python 列表理解

python - 为什么我不能在 python 中使用列表作为 dict 键?

java - Java 1.5 之前的集合框架实现是通用的吗?