【问题标题】:What is the difference between <> and <?> in Java generic types?Java泛型类型中的<>和<?>有什么区别?
【发布时间】:2014-03-02 15:30:10
【问题描述】:

当您创建一个采用泛型类型的集合字段时,您可以通过提供它来做到这一点吗?作为值或根本没有它们之间的区别:

例如

List<String> list = new ArrayList<?>();

List<String> list = new ArrayList<>();

List<String> list = new ArrayList<String>();

【问题讨论】:

    标签: java generics generic-list generic-collections


    【解决方案1】:

    第一句话是错误的;您不能实例化具有未知类型的参数化类。您可能会将它与类似的语法混淆,其中未知数位于声明的类型上,如下面的虚拟示例:

    public static String getClassName(Class<?> clazz) {
       return clazz.getName();
    }
    

    在上面的例子中,使用 > 表示可以提供任何类型的实例化。

    最后两个语句是等价的;在new ArrayList&lt;&gt;() 中,String 类型参数由编译器从左侧声明的类型推断出来,而在最后一条语句中,这是明确给出的。正如其他人正确指出的那样,这种类型推断仅在 Java 7 中可用。在 Java 7 之前,您可以利用在方法调用上推断类型的方式来实现类似的类型推断;例如,Guava 的Lists.newArrayList() 允许在右侧编写“Lists.newArrayList()”而无需再次指定类型,并且 JDK7 之前的编译器将正确地从左侧推断类型。

    【讨论】:

      【解决方案2】:

      您的第二个示例是 Java 1.7 引入的一个新特性。空的泛型括号隐含地采用左侧的泛型类型。所以基本上它和你上一个例子一样。

      另外你的第一个例子是穿的(正如其他人已经说过的)。有效的是

      List<?> list = new ArrayList<String>();
      

      【讨论】:

      • @montss,这仍然是错误的,因为在这种情况下您需要右侧的类型。
      • @MichaelAaronSafyan List&lt;?&gt; list = new ArrayList&lt;&gt;(); 将编译。
      • JDK 1.7_51 没有给出任何错误,我认为您的意思是逻辑错误?无论如何,这些只是让问题更清晰的例子,我认为这些人理解这个问题并且已经给出了答案,谢谢。
      • @Sotirios Delimanolis,感谢您指出这一点。我的意思是这是一个错误,但事实证明我错了(我猜在这种情况下它推断出“对象”?)。不过,我认为它仍然是一种糟糕的编码风格,因为左侧和右侧都没有给出显式类型(应始终在实例化点的某处给出显式类型)。
      • @MichaelAaronSafyan 是的,应该是Object。我试图通过this 找出原因,但在 10 秒后放弃了。
      【解决方案3】:
      List<String> list = new ArrayList<>(); 
      

      等价于

      List<String> list = new ArrayList<String>(); 
      

      算子&lt;&gt;被称为diamond,是在JDK7中引入的

      您问题中的第一个陈述无效。

      【讨论】:

      • ? 或多或少意味着什么
      【解决方案4】:

      第一行是wild card,最后两行是java 7引入的短代码,它们是相同的oracle source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 2010-10-15
        • 2019-08-29
        • 1970-01-01
        • 2020-05-23
        • 1970-01-01
        相关资源
        最近更新 更多