如何编写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
Comparable
被Comparable
取代? 如果是这样? -
Eclipse代码完成创建局部变量
List<? extends Comparable<? super Comparable>> list;
List<? extends Comparable<? super Comparable>> list;
在Ctrl + 1max(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 super T>
会有什么不同Comparable super T>
Comparable super T>
被Comparable
取代? 如果是这样?
请记住, 可比较对象总是消费者,即可Comparable
消耗T
实例,因此使用Comparable super T>
Comparable super T>
而不是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未实现Comparable
但Comparable
:
public static > T max(List extends T> 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 super T>
T extends Comparable super T>
。
请注意,您无法将Child类更改为:
class Child extends Parent implements Comparable
因为在这种情况下, Child类将从相同generics类型的不同实例化扩展,这是不允许的。
如果
T extends Object & Comparable super T>
它会有什么不同T extends Object & Comparable super T>
T extends Object & Comparable super T>
被替换为T extends 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)
当您正在泛化遗留的非通用代码时,可能会出现此问题。 将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
承认这一事实。