了解java集合类中泛型的使用

了解java集合类中泛型的使用,java,generics,collections,types,Java,Generics,Collections,Types,在研究Java的集合类(OpenJDK 8_update40)之后,我发现了以下方法: public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) { Iterator<? extends T> i = coll.iterator(); T candidate = i.next(); w

在研究Java的集合类(OpenJDK 8_update40)之后,我发现了以下方法:

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;
}

publicstatic因为如果不使用“T”,集合将只接受对象的实例


例如,字符串是对象的子类型,但不会编译,因为集合只接受对象实例。

这是出于向后兼容的原因

当使用泛型类型且此泛型类型具有下限时,例如:

<T extends Foo & Bar> void someMethod(T xxx)
(好吧,参数名称不在那里,但你可以理解)

现在,
Collections.max()
是在JDK5之前定义的;其签名为:

public static Object max(Collection coll)
在Java 5中,可以将其翻译为:

public static Object max(Collection<Object> coll)
publicstaticobjectmax(Collection coll)
问题是
max
的返回值不能是
可比的


当然,在这种情况下,增加了更多的困难:

  • 第二个下限是它本身是一个泛型类型
  • 此外,
    Comparable
    是PECS方式的“消费者”(因此,
    Comparable这是由于

    一般来说:


    • 如果泛型类型T用于返回值,那么您可以使用
      为什么对象绑定-简短答案-向后兼容性。不用担心,您不需要关心。我知道泛型用于什么,但这并不能回答我的问题。我的观点是,我相信op的问题更多的是关于“为什么对象”;但关于你所描述的,这几乎是PEC。对吗?我想我误解了这个问题。是的,这就是我所描述的。虽然向后兼容性问题是OP的问题所在,但我试着想象一个场景需要所有这些
      扩展
      超级
      子句,但我找不到。它需要一个显式类型参数,既不匹配实际的
      可比较的
      实现,也不匹配
      集合的类型
      ,以利用这些可能性。但是没有可以想象的理由插入这样一个显式类型参数。因此,至少
      中扩展了
      Collection@Holger不知道你在说什么ean在此;此方法确实要求将类型参数定义为返回类型。您可以详细说明吗?您始终可以推断
      T
      的最具体类型,即集合的元素类型,并使用该类型作为方法的返回类型。它仍然可以分配给
      T
      的每个超类型。这就是
      Collect>的原因ion
      就足够了,扩展返回元素的类型始终是可能的。顺便说一句,当编译器推断出
      T
      时,这种情况总是会发生。这就是为什么我说的,您需要插入一个显式类型见证,而不是与集合的元素类型匹配,以利用当前的灵活性。但是,对于t、 …
      public static Object max(Collection<Object> coll)