我有一个功能:
draw(int[] a)
{
//...
}
我希望传入数组{3,4,5}
。为什么我不能打电话:
draw({3,4,5});
答案 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)
数组是通过引用传递的。传递引用意味着当一个数组作为参数传递时,它的内存地址位置实际上被传递,称为它的“引用”。
答案 8 :(得分:0)
我想在这里回答其他一些答案。这是一种语言设计选择,不支持数组创建的语法。但可能不是因为这种结构总是含糊不清。只是说{3,4,5}
“含糊不清”或“不反映类型”是过于简单化。
数组初始化表达式可能存在歧义,可能是数组创建的简写,但它不是来自像{3,4,5}
这样的简单情况。您可以使用类型提升规则定义规则,以明确确定数组初始值设定项的类型,如{x,y,z}
,方法与确定类似x+y+z
的算术表达式的类型相同。那么在这个假设的情况下,{3,4,5}
会在int[]
还是short[]
?它将是int[]
,因为3
,4
和5
是整数。
即使没有接口的对象,也可以说{x,y,z,...}
的类型是所有数组元素表达式都可分配的最具体的公共超类。最低的共同点,如果你愿意的话。
但是对于接口,你实际上有多个继承,所以你可能有多个超类型,数组的所有元素都可以分配给它们,但这些超类型都不能彼此分配,所以你有一个真正的歧义。
零元素案例{}
,现在不明确了。
语言设计者可以提供一条规则,说明“对于初始化程序的类型,数组初始化表达式本身被视为new T[]{...}
”。即使使用接口,他们也可以提供它并加上“......在类型明确的情况下,否则它是编译错误”。但他们没有。也许是因为他们不想让这种含糊不清。也许是因为类型确定规则对于编译器或开发人员来说会很复杂。也许是因为他们不希望在堆上分配一堆小数组太容易了。但不是因为{3,4,5}
根本无法解释。