【问题标题】:Diamond operator ArrayList [duplicate]菱形运算符ArrayList [重复]
【发布时间】:2015-07-14 21:41:25
【问题描述】:

有什么区别

ArrayList<Integer> list = new ArrayList<>();

ArrayList<Integer> list = new ArrayList();

新建ArrayList时是否需要使用菱形运算符?

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    Java 的一个相当高级的主题称为泛型,这就是对所有 符号的解释。

    本质上,你应该总是写

    ArrayList<Integer> list = new ArrayList<>();
    

    因为它是简写

    ArrayList<Integer> list = new ArrayList<Integer>();
    

    并且你需要两个类型参数(位)来匹配,否则编译器会给你一个警告。

    写作:

    ArrayList<Integer> list = new ArrayList();
    

    创建一个可以容纳任何类型的 ArrayList,当您尝试将其转换为 ArrayList&lt;Integer&gt; 时,编译器会抛出警告。

    编辑:

    这里是关于泛型的用途和工作原理的深入指南。我不确定你是否达到了完全理解它们的水平,但值得一试。

    https://docs.oracle.com/javase/tutorial/java/generics/

    【讨论】:

      【解决方案2】:

      首先是ArrayList的参数化泛型对象,由参数化泛型引用引用。

      Second 是ArrayList 的非参数化非泛型对象,由参数化泛型引用引用。

      不,虽然在创建ArrayList 时不需要菱形运算符,但强烈建议稍后避免使用ClassCastException 或其他一些RuntimeException

      【讨论】:

        【解决方案3】:

        第一句话很清楚。第二个生成编译警告。

        Diamond iperator 被引入 java 1.7。从 java 1.5 开始,您必须编写

        ArrayList<Integer> list = new ArrayList<Integer>();
        

        即在赋值的左侧和右侧声明泛型类型。由于泛型类型可能比Integer 更复杂,因此将完全相同的定义复制两次很烦人,因此他们向编译器添加了这个很酷的功能:您只需要说:“这个类是泛型的,请使用使用&lt;&gt; 标记在作业的左侧。

        顺便说一句,最后一条评论。请避免在赋值和方法定义的左侧使用具体类。 以下更好:

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

        甚至

        Collection<Integer> list = new ArrayList<>();
        

        甚至经常

        Iterable<Integer> list = new ArrayList<>();
        

        【讨论】:

        • 非常翔实的答案,但您能否解释或提供阅读此声明的链接:Please avoid using concrete classes in the left side of assignments and method definitions. The following is much better:... 请为什么,谢谢
        猜你喜欢
        • 2013-01-07
        • 1970-01-01
        • 2017-08-09
        • 2013-04-27
        • 1970-01-01
        • 2023-03-20
        • 2018-04-22
        相关资源
        最近更新 更多