“可变长度参数”如何在Java中运行?

时间:2014-07-03 11:10:15

标签: java arrays variadic-functions

根据我的理解,具有可变长度参数的方法和具有数组作为参数的另一种方法是可互换的。例如。

void test(int ... ints){} //method-1

相同
void test (int [] ints){} //method-2

我们不能在同一个类中使用它们(编译时错误)。

当我使用方法-1时,我可以通过传递一些整数或传递整数数组来调用此方法,因为使用某些整数调用此方法将隐式创建这些整数的数组。

例如。

test(1,2,3); //ok
test(new int[5]); //ok

但是

当我使用方法-2时,我不能通过传递一些整数作为参数来调用此方法。

test(new int[5]); //ok
test(1,2,3); //NOT OK

问题:

1)如果java隐式创建了一个参数数组,为什么它不能在方法-2的情况下调用test(1,2,3)。

2)为什么当两者都显示不同的行为时,java不允许同时使用方法-1和方法2?

3 个答案:

答案 0 :(得分:1)

我能想到的一个区别是你可以在int []之后为metod提供额外的参数,但是你不能有这样的变量参数。变量参数应始终是方法的最后一个参数。实施例

void test(int[] a, int a) {} // works fine.
void test(int ... ints, int a){} // compile error.

答案 1 :(得分:0)

  

1)如果java隐式创建参数数组,为什么不是   在方法-2的情况下能够调用test(1,2,3)。

由于1,2,3中的test(1,2,3)不是数组,因此这些是三个不同的整数...您必须传递Array int来调用方法-2。

  

2)为什么java不允许同时使用方法-1和方法2   两者都表现出不同的行为?

当您使用数组作为参数调用方法时会产生歧义,因为在varargs和数组作为参数的情况下允许使用数组作为参数。

例如,如果允许这两种方法,test(new int[5])将产生歧义。

答案 2 :(得分:0)

这两种情况下函数声明的Java编译器中的内部表示是相同的。这就是编译器不会让你声明两个具有相同名称的函数的原因。

当您实际使用实际参数调用函数时,可以看到这两个声明的bahivour的差异。由于Java是强类型语言(具有严格的类型检查),因此它不允许您将三个整数传递给test(int [] a)方法。

但是,当您使用test(1,2,3)调用test(int ... a)时,编译器会生成中间代码以生成三个整数的临时数组,并将其传递给函数。