它们可能看起来相似,而且它们的行为也可能相似,但它们确实不同。
你第一个声明是一个数组初始化器。它只能在声明字段或变量时使用(就像你使用 int[] a = {1, 2, 3, 4, 5, 6} 一样),或者作为第二种形式——数组创建表达式的一部分。
数组初始化器需要一个可具体化类型才能成为有效的语法。这意味着你
不能使用它来创建泛型数组。例如:
public class Example<T> {
public void doStuff(T first, T second, T third) {
T[] stuff = {first, second, third};
}
public void doStuff(int first, int second, int third) {
int[] stuff = {first, second, third};
}
}
你所拥有的第二个声明是一个
数组创建表达式。它允许多种形式的数组声明。通过一些强制转换,它还可以
创建通用数组。
至于为什么第三个语法是无效的问题:下面是ArrayCreationExpression的摘录。
ArrayCreationExpression:
new PrimitiveType DimExprs Dims (optional)
new ClassOrInterfaceType DimExprs Dims (optional)
new PrimitiveType Dims ArrayInitializer
new ClassOrInterfaceType Dims ArrayInitializer
DimExprs:
DimExpr
DimExprs DimExpr
DimExpr:
[ Expression ]
Dims:
[ ]
Dims [ ]
实际上,
new int[5]{1, 2, 3, 4, 5}
这个语法无效的原因是因为上面提到的问题。
int[5]{1, 2, 3, 4, 5}
包含一个
DimsExpr
,即
[5]
部分,和一个
ArrayInitializer
,即
{1, 2, 3, 4, 5}
部分。上述语言规范不允许同时声明
DimsExpr(s)
和
ArrayInitializer
。