Java 为什么T由Collections.max()签名中的Object限定?
刚刚经历了Java7的Java 为什么T由Collections.max()签名中的Object限定?,java,generics,Java,Generics,刚刚经历了Java7的Java.util.Collections类的实现,看到了一些我不理解的东西。在max函数签名中,为什么T以对象为边界 public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) { Iterator<? extends T> i = coll.iterator(); T can
Java.util.Collections
类的实现,看到了一些我不理解的东西。在max
函数签名中,为什么T
以对象
为边界
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
实际上有没有什么情况下边界会产生影响?如果是,请提供一个具体的例子。两者的界限相同,但有细微的区别
<T extends Object & Comparable<? super T>>
这将导致T
在擦除时变得可比
<T extends Comparable<? super T>>
在本例中,之所以这样做是因为.max
早于Java5。如果Java 1.4.2中.max
的签名是:
public static Object max(Collection coll)
如果我们使用了,这有什么可取的原因吗?也许是因为,正因为如此,它比泛型更早。由于返回值是T
,这将在擦除后更改方法的签名。@templatetypedef是,主要在旧代码中。由于Java并不总是有泛型,在擦除之后,方法的签名与泛型化之前的签名保持相同,因此这是可取的。我记得在docs.oracle.com上读到过关于它的文章,我需要花更多的时间才能找到它。我从来没有想过在类型删除后的泛型签名。重复的,尽管这篇文章有更好的问题和答案。
public static Object max(Collection coll)
public static Comparable max(Collection coll)