Collections.min/max方法的签名

Mar*_*rco 15 java generics wildcard

在Java中,Collections类包含以下方法:

public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> c)
Run Code Online (Sandbox Code Playgroud)

它的签名因其对泛型的高级使用而闻名,因此在Java的Nutshell书籍和官方的Sun Generics Tutorial中都提到了它.

但是,我无法找到以下问题的令人信服的答案:

为什么类型的形式参数Collection<? extends T>,而不是Collection<T>?还有什么好处?

Mar*_*ers 6

类型推断是一个棘手的话题,我承认我不太了解.但是,请检查此示例:

public class ScratchPad {
   private static class A implements Comparable<A> {
     public int compareTo(A o) { return 0; }
   }
   private static class B extends A {}
   private static class C extends B {}

   public static void main(String[] args)
   {
     Collection<C> coll = null;
     B b = Scratchpad.<B>min(coll);
   }

   public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> c)  {
     return null;
   }

   //public static <T extends Object & Comparable<? super T>> T min(Collection<T> c) {
   //  return null;
   //}
}
Run Code Online (Sandbox Code Playgroud)

考虑min()的第一个签名允许调用编译而第二个签名不允许.这不是一个非常实际的例子,因为我必须问为什么我会明确地键入方法<B>,但也许有一个隐式推断,其中B将是推断类型.


akf*_*akf 5

这样做的一个好处?是它禁止添加物品Collection