1

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

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

仅仅是因为它是在列表中定义的吗?谢谢!

4

3 回答 3

4

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

这不是“坏习惯”——它只是比它可能的更啰嗦。这两个语句具有完全相同的效果,因此从这个意义上说,较长的版本没有缺点。你绝对不需要到处“修复”你所有的旧代码——但是当你编辑现有代码或编写新代码时,你可以选择使用较短的形式。

为什么这个版本不需要它?

因为 Java 7 引入了“菱形操作符”(实际上根本不是操作符)以避免冗余地指定类型参数。从关于“通用实例创建的类型推断”的Oracle 文档:

只要编译器可以从上下文推断类型参数,您就可以用一组空类型参数 (<>) 替换调用泛型类的构造函数所需的类型参数。这对尖括号被非正式地称为菱形。

从语言的角度来看,这并不是 Java 7 中唯一的新特性 - 再次,请参阅文档了解详细信息。

于 2013-09-23T06:02:09.570 回答
1

新格式只是帮助您节省一些击键。所以在 Java 7 中,当你编写

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

这被认为等于

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

使用菱形运算符时,编译器将自动从左侧推断类型。

于 2013-09-23T06:03:09.750 回答
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 中,后面的泛型替换是多余的

于 2013-09-23T06:02:52.750 回答