为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米琪卡哇伊 2022-09-22 19:50:01

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


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

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


public void callingMethod(T... params) 

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


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


public void callingMethod(T... params){

    [...]

    method(params[0], restOfParams);

    [...]

}


查看完整描述

3 回答

?
MM们

TA贡献1553条经验 获得超2个赞

当然,这是可能的,而且很容易。
唯一的开销是创建另一个数组。
请参阅尤金的答案以了解内存消耗。

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)



查看完整回答
反对 回复 4天前
?
aluckdog

TA贡献1505条经验 获得超4个赞

是的,至少有几个方面。

因为 Java 中的 varargs 是关于传入数组的语法糖,所以你可以创建一个包含其余参数的数组(可能使用 Arrays.copyOfRange),并将其作为第二个参数传递:

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

另一种方式是通过反思,但你在这里不需要它。


查看完整回答
反对 回复 4天前
?
DIEA

TA贡献1489条经验 获得超2个赞

我不明白你的问题,但不一定意味着在varargs中至少有一个参数。

此外,您可以检查参数长度 != 0

然后调用方法(参数[0],数组复制范围(参数,1,参数长度));


查看完整回答
反对 回复 4天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信