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

时间:2012-02-10 05:21:30

标签: java arrays

我有一个功能:

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

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

draw({3,4,5});

9 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

{3,4,5}并不能反映出什么类型。你应该这样打电话draw(new int[]{3,4,5});

答案 2 :(得分:2)

因为Java不是matlab!您必须先创建/注册一个数组才能通过它!

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

因为{3,4,5}不是数组。 (如果是的话,的数组是什么?)

答案 5 :(得分:1)

您可以通过这种方式传递:draw(new int[]{3,4,5})

答案 6 :(得分:1)

查看其他的ansers,为什么你不能像你一样尝试。

但你可以这样做:

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

draw(3,4,5);

答案 7 :(得分:0)

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

  1. {3,4,5}不反映您将使用的是什么类型。
  2. 如果你想要传递数组,你应该像这个绘图一样调用(new int [] {3,4,5});所以方法可以知道你将使用数组。

答案 8 :(得分:0)

我想在这里回答其他一些答案。这是一种语言设计选择,不支持数组创建的语法。但可能不是因为这种结构总是含糊不清。只是说{3,4,5}“含糊不清”或“不反映类型”是过于简单化。

数组初始化表达式可能存在歧义,可能是数组创建的简写,但它不是来自像{3,4,5}这样的简单情况。您可以使用类型提升规则定义规则,以明确确定数组初始值设定项的类型,如{x,y,z},方法与确定类似x+y+z的算术表达式的类型相同。那么在这个假设的情况下,{3,4,5}会在int[]还是short[]?它将是int[],因为345是整数。

即使没有接口的对象,也可以说{x,y,z,...}的类型是所有数组元素表达式都可分配的最具体的公共超类。最低的共同点,如果你愿意的话。

但是对于接口,你实际上有多个继承,所以你可能有多个超类型,数组的所有元素都可以分配给它们,但这些超类型都不能彼此分配,所以你有一个真正的歧义。

零元素案例{},现在不明确了。

语言设计者可以提供一条规则,说明“对于初始化程序的类型,数组初始化表达式本身被视为new T[]{...}”。即使使用接口,他们也可以提供它并加上“......在类型明确的情况下,否则它是编译错误”。但他们没有。也许是因为他们不想让这种含糊不清。也许是因为类型确定规则对于编译器或开发人员来说会很复杂。也许是因为他们不希望在堆上分配一堆小数组太容易了。但不是因为{3,4,5}根本无法解释。