[英]Passing variable number of parameters from calling method
假設我們有一個方法可以接收至少一個參數,並且可能接收0個或多個相同類型的參數:
public void method(T p1, T... otherPs)
並且我們有一個調用它的方法,如下所示:
public void callingMethod(T... params)
我們知道至少有一個參數。
是否可以從callingMethod
調用method
看起來像這樣?
public void callingMethod(T... params){
[...]
method(params[0], restOfParams);
[...]
}
當然,這是可能的,而且非常容易。
唯一的開銷是創建另一個數組。
請參閱Eugene 答案以了解內存消耗。
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)
是的,至少有兩種方式。
由於Java中的varargs是傳遞數組的語法糖,因此yu可以使用其余參數創建數組(也許使用Arrays.copyOfRange
)並將其作為第二個參數傳遞:
method(params[0], Arrays.copyOfRange(params, 1, params.length));
另一種方法是通過反射,但是您在這里不需要。
我不明白您的問題,但不一定要在varargs中至少包含一個參數。
此外,您可以檢查params.length!= 0
然后調用method(params [0],Arrays.copyOfRange(params,1,params.length));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.