为什么在Java中不能像这样传递数组

8

我有一个函数:

draw(int[] a)
{
   //...
}

我希望传入数组{3,4,5}。为什么我不能调用:

draw({3,4,5});

这里是参考资料:https://dev59.com/V3I-5IYBdhLWcg3w6tJR 和可以帮助你的网址http://www.jforeach.com/difference-between-object-and-reference-in-java/62 - Pankaj Kumar
9个回答

7

{3,4,5}的类型不明确(可能是int[]short[]long[]等)。尝试:

draw(new int[]{3,4,5});

2

{3,4,5}并不能反映出其类型。你应该这样调用draw(new int[]{3,4,5});


2

因为Java不是Matlab!在传递数组之前,您必须创建/注册一个数组!


2
你也必须在Matlab中创建数组;Matlab只是有更简洁的语法来完成这个任务。 - Andrew Janke

2

您需要将其称为draw(new int[]{3,4,5})

{3,4,5}是一种数组初始化方法,没有前缀new int[]是没有意义的。您可以将{3,4,5}视为传递给名为int[]的函数的参数,该函数将返回一个新数组。


1

看看其他答案,为什么你不能像你尝试的那样做。

但是你可以这样做:

draw(int... a)
{
    //...
}

draw(3,4,5);

是的,这也是我首选的方式,因为你仍然可以传递“普通”的数组。 - Axel

1

因为{3,4,5}不是一个数组。(如果它是,那它会是一个什么类型的数组呢?)


1
你可以这样传递参数:draw(new int[]{3,4,5})

0

数组是按引用传递的。按引用传递意味着当一个数组作为参数传递时,它的内存地址位置实际上被传递,称为它的“引用”。

  1. {3,4,5} 不反映你将要使用的类型。
  2. 如果你想传递数组,应该这样调用 draw(new int[]{3,4,5}); 这样方法就知道你将要使用这个数组了。

0
我想回应这里其他答案的一些观点。不支持数组创建的语法是一种语言设计选择。但这并不意味着这种结构总是模棱两可的。仅仅说 {3,4,5} 是“模棱两可的”或“不能反映类型”是一种过度简化。
数组初始化表达式作为数组创建的简写形式存在潜在的歧义,但它并不来自于像 {3,4,5} 这样的简单情况。你可以定义一个规则,以确定数组初始化器的类型,就像确定算术表达式 x+y+z 的类型一样,使用类型提升规则。那么在这种假设情况下,{3,4,5}int[] 还是 short[]?它将是一个 int[],因为 345 都是 int。
即使是没有接口的对象,你也可以说 {x,y,z,...} 的类型是所有数组元素表达式都可以分配的最具体的公共超类。你可以理解为最低公共分母。

但是使用接口,您实际上具有多重继承,因此您可能有多个超类型可将数组的所有元素分配给它们,但这些超类型都不能相互分配,因此您会遇到真正的歧义。

而且,零元素情况下的{},现在就变得模糊不清了。

语言设计者可以提供一条规则,即“仅使用数组初始化器表达式时,将其视为类型为初始化器的new T[]{...}”。即使使用接口,他们也可以提供并添加“...如果类型不明确,则为编译错误”的说明。但他们没有这样做。也许是因为他们不想允许歧义。也许是因为类型确定规则对于编译器或开发人员来说太复杂了。也许是因为他们不想让在堆上分配一堆小数组变得太容易。但不是因为{3,4,5}在根本上无法解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接