【问题标题】:When is specifying generic types for collections necessary?什么时候需要为集合指定泛型类型?
【发布时间】:2019-10-29 04:47:15
【问题描述】:

以下代码行分别编译(当然,在单独的方法中):

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

其中一个是否比其他更受鼓励?这些选项之间的行为有什么不同吗?

【问题讨论】:

    标签: java generics collections conventions


    【解决方案1】:

    &lt;&gt; 称为菱形运算符,它从引用变量声明中确定类型。

    Recommended is using diamond operator 因为这避免了类型变量的样板或重复声明,因为它在变量声明中清晰可见,同时允许类型默认为 Object 类类型(如果未指定)。

    除了List&lt;String&gt; list = new ArrayList(); 发出警告或根本不被认为是一种好的做法之外,以上三个都是有效的。

    我的想法: List&lt;String&gt; list = new ArrayList(); 从这个角度来看也可能是一个有效的声明,但它默认为 Object 类型的数组列表(Java 就是这样)。准确地说:

    如果不指定类型,则默认为Object类型

    【讨论】:

    • new ArrayList() 不默认为Object,它使用的是原始类型 List。这就是为什么将其分配给 List&lt;String&gt; 是合法的,但会产生编译器警告(除非关闭)。
    【解决方案2】:

    这种形式的声明对 Java 版本 6 之前有效

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

    此声明形式适用于 Java 版本 7+

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

    最后对于这个版本,编译器会生成一个未经检查的转换警告,但它可以工作:

    List<String> list = new ArrayList();
    

    完整的解释参考这个link

    【讨论】:

      猜你喜欢
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2015-01-19
      相关资源
      最近更新 更多