我注意到当我创建一个任何特定类型对象的数组列表时,我需要像这样初始化它:
List<Object> objectList = new ArrayList<Object>();
为什么我必须初始化包含Object的右侧?即,为什么我不能在不再识别Object类的情况下初始化它? - 比如
List<Object> objectList = new ArrayList<>();
如果可以的话,为什么我可以这样做以及以这种方式做到这一点的好处(或其中的损失)是什么?
我研究了这个,我发现的唯一的事情是包括第二个对象的初始化。我想知道这种结构的“原因”。
我知道(现在)这个问题有一个明确的答案(我在这里找到了 What is the point of the diamond operator in Java 7? ),但是我离开了这个因为在不知道术语'钻石'的情况下进行研究非常困难运算符”。
答案 0 :(得分:1)
他们完全一样;如果你什么都不放,它将使用声明类。它通常被称为钻石操作员(你可以查找),虽然它不是操作员。
基本上如果你把它留空,并且它不是一个匿名的内部类(这将在Java 9中修复),它将使用声明类作为实例化类。由于泛型不是协变的,这通常是你想要的。
PS。它是在Java 7中引入的,如果您使用的是旧版本,则需要在尖括号内添加该类。
PPS。 Here's您需要知道的一切;)
答案 1 :(得分:1)
在Java 1.5中引入了泛型,并且在Java 1.7中引入了菱形运算符作为声明泛型类型的便捷方式。
在大多数情况下,在Java 1.7之上工作时,为了简洁起见,您将使用菱形运算符。在某些情况下,如果可读性保证在语句中显示泛型类型,您仍可以声明类型。
答案 2 :(得分:1)
从Java 7开始,您可以使用菱形运算符&lt;&gt;创建泛型。
while read -d ':' p; do
echo "$p"
done <<< "$PATH:"
在JDK 7 +中是正确的。
答案 3 :(得分:0)
一般而言:
在你的情况下,他们都是平等的,因为你已经宣布了这种类型。
答案 4 :(得分:0)
可以使用这两个版本。缩短版本在2009年作为Java 7的一部分引入。这允许您通过保存重复的类型参数来编写更紧凑(和可读)的代码。