从调用方法传递可变数量的参数

时间:2019-04-05 09:16:11

标签: java

假设我们有一种方法可以接收至少一个参数,并且可能接收0个或多个相同类型的参数:

public void method(T p1, T... otherPs)

我们有一个调用它的方法,如下所示:

public void callingMethod(T... params) 
我们知道的

至少有一个参数。

是否可以从method调用callingMethod来看起来像这样?

public void callingMethod(T... params){
    [...]
    method(params[0], restOfParams);
    [...]
}

3 个答案:

答案 0 :(得分:4)

当然可以,而且很容易。
唯一的开销就是创建另一个数组。
请参阅Eugene answer了解内存消耗。


public void callingMethod(T... params){
    ...
    method(params[0], Arrays.copyOfRange(params, 1, params.length));
    ...
}

与主题无关,但是我按照建议运行了JOL,这是空引用数组的输出

final String[] array = new String[0];

# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 0x0000000800000000 base address and 0-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

[Ljava.lang.String;@7ea37dbfd object externals:
          ADDRESS       SIZE TYPE                PATH                           VALUE
        71695b2d0         16 [Ljava.lang.String;                                []

对于具有单个null元素的数组

final String array = new String[1];

[Ljava.lang.String;@7ea37dbfd object externals:
          ADDRESS       SIZE TYPE                PATH                           VALUE
        71692a7a8         24 [Ljava.lang.String;                                [null]

对于包含单个非null元素的数组

final String array = new String[1];
array[0] = new String("");

[Ljava.lang.String;@7ea37dbfd object externals:
          ADDRESS       SIZE TYPE                PATH                           VALUE
        707612b68         16 [B                  [0].value                      []
        707612b78    1577856 (something else)    (somewhere else)               (something else)
        707793ef8         24 [Ljava.lang.String;                                [(object)]
        707793f10         24 java.lang.String    [0]                            (object)

答案 1 :(得分:3)

是的,至少有几种方式。

由于Java中的varargs是传递数组的语法糖,因此yu可以使用其余参数(也许使用Arrays.copyOfRange)创建一个数组,并将其作为第二个参数传递:

method(params[0], Arrays.copyOfRange(params, 1, params.length));

另一种方法是通过反射,但是您在这里不需要。

答案 2 :(得分:-1)

我不明白您的问题,但不一定要在varargs中至少包含一个参数。

此外,您可以检查params.length!= 0

然后致电     method(params [0],Arrays.copyOfRange(params,1,params.length));