我有一个函数:
draw(int[] a)
{
//...
}
我希望传入数组{3,4,5}
。为什么我不能调用:
draw({3,4,5});
{3,4,5}
的类型不明确(可能是int[]
、short[]
、long[]
等)。尝试:
draw(new int[]{3,4,5});
{3,4,5}
并不能反映出其类型。你应该这样调用draw(new int[]{3,4,5});
因为Java不是Matlab!在传递数组之前,您必须创建/注册一个数组!
您需要将其称为draw(new int[]{3,4,5})
{3,4,5}是一种数组初始化方法,没有前缀new int[]
是没有意义的。您可以将{3,4,5}视为传递给名为int[]
的函数的参数,该函数将返回一个新数组。
看看其他答案,为什么你不能像你尝试的那样做。
但是你可以这样做:
draw(int... a)
{
//...
}
draw(3,4,5);
因为{3,4,5}
不是一个数组。(如果它是,那它会是一个什么类型的数组呢?)
draw(new int[]{3,4,5})
。数组是按引用传递的。按引用传递意味着当一个数组作为参数传递时,它的内存地址位置实际上被传递,称为它的“引用”。
{3,4,5}
是“模棱两可的”或“不能反映类型”是一种过度简化。{3,4,5}
这样的简单情况。你可以定义一个规则,以确定数组初始化器的类型,就像确定算术表达式 x+y+z
的类型一样,使用类型提升规则。那么在这种假设情况下,{3,4,5}
是 int[]
还是 short[]
?它将是一个 int[]
,因为 3
、4
和 5
都是 int。{x,y,z,...}
的类型是所有数组元素表达式都可以分配的最具体的公共超类。你可以理解为最低公共分母。
但是使用接口,您实际上具有多重继承,因此您可能有多个超类型可将数组的所有元素分配给它们,但这些超类型都不能相互分配,因此您会遇到真正的歧义。
而且,零元素情况下的{}
,现在就变得模糊不清了。
语言设计者可以提供一条规则,即“仅使用数组初始化器表达式时,将其视为类型为初始化器的new T[]{...}
”。即使使用接口,他们也可以提供并添加“...如果类型不明确,则为编译错误”的说明。但他们没有这样做。也许是因为他们不想允许歧义。也许是因为类型确定规则对于编译器或开发人员来说太复杂了。也许是因为他们不想让在堆上分配一堆小数组变得太容易。但不是因为{3,4,5}
在根本上无法解释。