在 Java 中,可變參數方法(帶有變數的方法)參數)使用省略號 (...) 來指示該方法接受可變數量的參數。當您將陣列傳遞給變數 arity 方法時,陣列元素將被視為該方法的單獨參數。
請考慮以下程式碼:
class A { private String extraVar; public String myFormat(String format, Object... args) { return String.format(format, extraVar, args); } }
在此範例中,myFormat 方法接受可變數量的參數(由... args 表示)並使用String.format 方法格式化字符串。問題在於 args 被視為單一 Object[] 數組,而不是單一參數。為了解決這個問題,您可以利用 T... 是 T[] 的語法糖。
Java 語言規格8.4.1 規定:
「如果最後一個形式參數是一個T 類型的可變參數,它被認為定義了一個T[] 類型的形式參數,那麼方法就是一個可變參數方法。方法:在此範例中,ezFormat 方法採用可變數量的參數並傳回格式化字串。因為 String.format 也是變數 arity 方法,所以傳遞給 ezFormat 的每個參數都被視為 String.format 的單一參數。
public static String ezFormat(Object... args) { String format = new String(new char[args.length]).replace("<pre class="brush:php;toolbar:false">static void count(Object... objs) { System.out.println(objs.length); } count(null, null, null); // prints "3" count(null, null); // prints "2" count(null); // throws java.lang.NullPointerException!!!
變數Arity 方法陷阱
...將導致NullPointerException。為了避免這種情況,您可以將null 參數作為單獨的數組或物件傳遞,如下所示:
count(new Object[] { null }); // prints "1" count((Object) null); // prints "1"
static <T> T[] append(T[] arr, T lastElement) { final int N = arr.length; arr = java.util.Arrays.copyOf(arr, N+1); arr[N] = lastElement; return arr; } static <T> T[] prepend(T[] arr, T firstElement) { final int N = arr.length; arr = java.util.Arrays.copyOf(arr, N+1); System.arraycopy(arr, 0, arr, 1, N); arr[0] = firstElement; return arr; }
int[] myNumbers = { 1, 2, 3 }; System.out.println(ezFormat(myNumbers)); // prints "[ [I@13c5982 ]" Integer[] myNumbers = { 1, 2, 3 }; System.out.println(ezFormat(myNumbers)); // prints "[ 1 ][ 2 ][ 3 ]"
以上是我可以將陣列作為參數傳遞給帶有變數參數的 Java 方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!