当我试图解决练习时 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+1max(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 withComparable<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 withT 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/