Java 变量arity参数上不允许使用传统数组表示法
我问这个问题是出于好奇,因为我还没有发现有关StackOverflow上这个特定编译错误的问题: 变量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
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的主要问题。行李太多,无法保持向后兼容性。像科特林这样的东西似乎就是未来!