Set/List JDK 8 中的初始化语法
Set/List Initialization Syntax in JDK 8
在JDK8中,编译器建议省略这个
ArrayList<String> someList = new ArrayList<String>();
对此
ArrayList<String> someList = new ArrayList<>();
将第二个 String
标记为冗余。
但是,即使像这样完全省略菱形运算符,编译器也不会报错
ArrayList<String> someList = new ArrayList();
这似乎不会在运行时产生任何问题。有钻石运营商和没有钻石运营商之间有什么具体区别吗?如果有人能详细说明,我将不胜感激。
In JDK 8, compiler suggests to omit this
ArrayList<String> someList = new ArrayList<String>();
To this
ArrayList<String> someList = new ArrayList<>();
钻石 <>
运算符是在 Java 7 中引入的,因为它很容易推断类型并且无需重复类型。
However, compiler does not complain even if the diamond operator is completely omitted like this
ArrayList<String> someList = new ArrayList();
此处您使用的是 Raw Types,这是不鼓励的。
为了向后兼容,在 运行 时所有 Collection
都被视为包含 Object
。泛型用于在编译时 建立契约,它说 每次将某物放入或取出该集合时,它 必须 类型为 xxx.
None 的泛型细节保留在 运行 时间(称为类型擦除),因为泛型是 [=41= 的 仅编译时 特性].
因此,此代码实际上是完全可以接受的(尽管不鼓励)。但是,如果您达到:
ArrayList someList = new ArrayList();
你会开始发现非常奇怪和意想不到的事情。
这些只是编译器警告。
建议删除类型以使用菱形运算符的警告似乎已打开。关于缺少 type/diamond 运算符的警告未打开。
无论如何,编译后的代码是相同的。
本质上,这些警告是为了帮助生成 'safer' 代码,即更易于阅读。
在JDK8中,编译器建议省略这个
ArrayList<String> someList = new ArrayList<String>();
对此
ArrayList<String> someList = new ArrayList<>();
将第二个 String
标记为冗余。
但是,即使像这样完全省略菱形运算符,编译器也不会报错
ArrayList<String> someList = new ArrayList();
这似乎不会在运行时产生任何问题。有钻石运营商和没有钻石运营商之间有什么具体区别吗?如果有人能详细说明,我将不胜感激。
In JDK 8, compiler suggests to omit this
ArrayList<String> someList = new ArrayList<String>();
To this
ArrayList<String> someList = new ArrayList<>();
钻石 <>
运算符是在 Java 7 中引入的,因为它很容易推断类型并且无需重复类型。
However, compiler does not complain even if the diamond operator is completely omitted like this
ArrayList<String> someList = new ArrayList();
此处您使用的是 Raw Types,这是不鼓励的。
为了向后兼容,在 运行 时所有 Collection
都被视为包含 Object
。泛型用于在编译时 建立契约,它说 每次将某物放入或取出该集合时,它 必须 类型为 xxx.
None 的泛型细节保留在 运行 时间(称为类型擦除),因为泛型是 [=41= 的 仅编译时 特性].
因此,此代码实际上是完全可以接受的(尽管不鼓励)。但是,如果您达到:
ArrayList someList = new ArrayList();
你会开始发现非常奇怪和意想不到的事情。
这些只是编译器警告。
建议删除类型以使用菱形运算符的警告似乎已打开。关于缺少 type/diamond 运算符的警告未打开。
无论如何,编译后的代码是相同的。
本质上,这些警告是为了帮助生成 'safer' 代码,即更易于阅读。