集合的签名.最小/最大方法

2022-09-03 14:22:38

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

public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> c)

它的签名以其对泛型的高级使用而闻名,以至于在Java的Nutshell书和官方的Sun Generics教程中都提到了它。

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

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


答案 1

类型推断是一个棘手的话题,我承认我对此知之甚少。但是,请检查此示例:

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

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


答案 2

的一个好处是,它禁止将项目添加到?Collection


推荐