Java 变量arity参数上不允许使用传统数组表示法

Java 变量arity参数上不允许使用传统数组表示法,java,arrays,java-8,variadic-functions,Java,Arrays,Java 8,Variadic Functions,我问这个问题是出于好奇,因为我还没有发现有关StackOverflow上这个特定编译错误的问题: 变量arity参数上不允许使用传统数组表示法 当看到一些代码包含这样的签名时,我遇到了遗留符号: private void a(int ints[]){/*…*/} 因此,我在下面的示例中遇到编译错误之前一直在玩 // this method compiles as expected private void method1(int[][] ints){ /*...*/ } // this too

我问这个问题是出于好奇,因为我还没有发现有关StackOverflow上这个特定编译错误的问题:

变量arity参数上不允许使用传统数组表示法

当看到一些代码包含这样的签名时,我遇到了遗留符号:

private void a(int ints[]){/*…*/}

因此,我在下面的示例中遇到编译错误之前一直在玩

// this method compiles as expected
private void method1(int[][] ints){ /*...*/ }

// this too
private void method2(int[]... ints){ /*...*/ }

// this does to, but makes use of legacy array notation
private void method3(int ints[][]){ /*...*/ }

// this still does, even when mixing up the notations
private void method4(int[] ints[]){ /*...*/ }

// this however fails to compile
private void method5(int... ints[]){ /*...*/ }
语言设计者决定以这种方式实现它,有什么具体原因吗?不允许使用传统数组表示法的varargs

注意:我理解传统符号


inta[]
inta[]
是同一件事

所以1,3和4是等价的

在2中,您基本上是说“我想要int[]类型的varargs”

因此可以像
method2(newint[]{},newint[]{})一样调用它

在5中,
int..
告诉编译器它是一个类型为
int
的vararg,参数名被取为
ints[]
,这是无效的变量名。

我不知道他们为什么决定这样做*,我只想确认这是规范的正式部分,完全是为了产生编译时错误:

使用混合数组表示法是编译时错误 () 对于变量arity参数


*这个问题是基于观点的,因为除了Java语言设计者之外,没有人能告诉你。如果我要推测的话,很可能是因为首先允许多个符号是个坏主意。

嗯,似乎没有其他原因。我的意思是,如果你在最后一个方法参数名中去掉
[]
,它会起作用。@Lino
..
是一种特殊的语法糖,编译器通过查看
..
之前的内容来决定类型。因此,它与其他数组声明不同。我没有尝试过它,但你可以通过
javap
检查它,@Lino这是现在Java的主要问题。行李太多,无法保持向后兼容性。像科特林这样的东西似乎就是未来!