Arraylists的明确规范

时间:2013-09-23 05:59:54

标签: java list arraylist java-7

自Java7以来,数组列表的显式规范是否被认为是一种不好的做法?为什么这个版本不必要?

List<String> foo = new Arraylist<String>(); // before
List<String> bar = new Arraylist<>(); // from Java7

是否只是因为它在列表中定义了? 谢谢!

3 个答案:

答案 0 :(得分:4)

  

自Java7以来,数组列表的显式规范是否被认为是一种不好的做法?

这不是“糟糕的做法” - 它只是比它可能更长一点。这两个语句具有完全相同的效果,因此在这个意义上较长的版本没有任何缺点。您绝对不需要“修复”所有旧代码 - 但是当您编辑现有代码或编写新代码时,您可以选择使用较短的代码。

  

为什么这个版本不必要?

因为Java 7引入了“菱形运算符”(实际上根本不是运算符),以避免必须冗余地指定类型参数。来自Oracle documentation“通用实例创建的类型推断”:

  

只要编译器可以从上下文中推断出类型参数,就可以用一组空的类型参数(&lt;&gt;)替换调用泛型类的构造函数所需的类型参数。这对尖括号被非正式地称为钻石。

从语言角度来看,这不是Java 7中唯一的新功能 - 有关详细信息,请参阅the documentation

答案 1 :(得分:1)

我不认为这是一种不好的做法,它只是让程序员感到轻松的一种方式。考虑一下这个

Map<List<String>,Map<String,Integer>> superMap = new HashMap<>();

同样应该写成

Map<List<String>,Map<String,Integer>> superMap = new HashMap<List<String>,Map<String,Integer>>();

在Java 6中,后面的泛型替换是多余的

答案 2 :(得分:1)

新格式可以帮助您保存一些按键。所以在Java 7中编写时

List<String> bar = new Arraylist<>();

被认为等于

List<String> foo = new Arraylist<String>();

当使用钻石操作符时,编译器将自动从左侧推断出类型。