Java 为什么T由Collections.max()签名中的Object限定?

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

刚刚经历了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 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 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上读到过关于它的文章——我需要花更多的时间才能找到它。我从来没有想过类型擦除后的泛型签名。有什么理由这样做是可取的吗?可能是因为这样的情况比泛型更早。由于返回值是
T
,这将在擦除后更改方法的签名。@templatetypedef是,主要在旧代码中。由于Java并不总是有泛型,在擦除之后,方法的签名与泛型化之前的签名保持相同,因此这是可取的。我记得在docs.oracle.com上读到过关于它的文章——我需要花更多的时间才能找到它。我从来没有想过在类型擦除后的泛型签名。尽管这篇文章有更好的问题和答案,但重复了。尽管这篇文章有更好的问题和答案,重复了。