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

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


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

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


public void callingMethod(T... params) 

我们知道至少有一个参数。


有没有可能从中调用看起来像这样的东西?methodcallingMethod


public void callingMethod(T... params){

    [...]

    method(params[0], restOfParams);

    [...]

}


米琪卡哇伊
浏览 83回答 3
3回答

MM们

当然,这是可能的,而且很容易。唯一的开销是创建另一个数组。请参阅尤金的答案以了解内存消耗。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;                                []对于具有单个 、 元素的数组nullfinal String array = new String[1];[Ljava.lang.String;@7ea37dbfd object externals:          ADDRESS       SIZE TYPE                PATH                           VALUE        71692a7a8         24 [Ljava.lang.String;                                [null]对于包含单个非元素的数组nullfinal 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)

aluckdog

是的,至少有几个方面。因为 Java 中的 varargs 是关于传入数组的语法糖,所以你可以创建一个包含其余参数的数组(可能使用 Arrays.copyOfRange),并将其作为第二个参数传递:method(params[0], Arrays.copyOfRange(params, 1, params.length));另一种方式是通过反思,但你在这里不需要它。

DIEA

我不明白你的问题,但不一定意味着在varargs中至少有一个参数。此外,您可以检查参数长度 != 0然后调用方法(参数[0],数组复制范围(参数,1,参数长度));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java