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

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

我的答案

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

从下面引用的答案

所以我的问题是

  • 选项1:如果T extends Object & Comparable它会有什么不同T extends Object & Comparable T extends Object & Comparable被替换为T extends Comparable T extends Comparable 。 是不是extends Object隐含?

  • 选项2:如果Comparable它会有什么不同Comparable ComparableComparable取代? 如果是这样?

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


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

回答:

 import java.util.*; public final class Algorithm { public static <T extends Object & Comparable> T max(List 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; } } 

如果Comparable会有什么不同Comparable ComparableComparable取代? 如果是这样?

请记住, 可比较对象总是消费者,即可Comparable消耗T实例,因此使用Comparable Comparable而不是Comparable (Quoting – PECS )。 如果您要比较其超类实现Comparable的类型,则会有所不同。 请考虑以下代码:

 class Parent implements Comparable { 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 ,则无法为List调用该方法,因为Child未实现ComparableComparable

 public static > T max(List list, int begin, int end) { ... } public static void main(String[] args) { List list = new ArrayList(); max(list, 0, 2); // Error with current method. Child does not implement Comparable } 

因此类型参数边界应该是T extends Comparable T extends Comparable

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

 class Child extends Parent implements Comparable 

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


如果T extends Object & Comparable它会有什么不同T extends Object & Comparable T extends Object & Comparable被替换为T extends Comparable T extends Comparable 。 是不是extends Object隐含?

那么,这两个界限之间存在差异。 在第1个边界中,类型参数的擦除是Object ,而在第2个边界中,擦除是Comparable

因此,如果没有Object绑定,您的代码将编译为:

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

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

看起来有更多的通配符。 我可能会去

 public static > T max(List list, int begin, int end) 

一个更受限制的版本:

 public static > T max(List list, int begin, int end) 

T必须具有与其自身相当的超类型。 例如, T不能是Foo

  class Foo implements Comparable 

无论如何,Foo没有意义; a Comparable只能与其自身类型进行有意义的比较。 C extends Comparable条款C extends Comparable承认这一事实。