簡體   English   中英

從調用方法傳遞可變數量的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM