java - Collections.min/max方法的签名

标签 java generics wildcard

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

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

它的签名因其对泛型的高级使用而闻名, 以至于在《Java in a Nutshell》一书中提到过 并在官方 Sun Generics Tutorial .

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

为什么形参类型是Collection<? extends T> , 相当 比Collection<T> ?有什么额外好处?

最佳答案

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

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将是推断的类型。

关于java - Collections.min/max方法的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367673/

相关文章:

java - 删除工具栏和 tablayout 之间的空间间隙

Java:关闭流后使引用为空

c# - 如何创建泛型方法以返回调用指定的特定类型?

batch-file - 在批处理文件的路径中使用多个通配符

azure - 多域通配符 SSL 映射多个 Azure 应用服务应用程序

java - play 2.0中没有play.test.FunctionalTest怎么写功能测试?

java - 为什么 JAXB 的 xjc 的 XML 文件输入与我的不同?

java - 使用泛型返回多个类型

java - java 中的类型检查和泛型会生成警告

vba - 在 Microsoft Word 的 VBA 宏中的查找和替换功能中使用通配符