首頁 >Java >java教程 >我可以將陣列作為參數傳遞給帶有變數參數的 Java 方法嗎?

我可以將陣列作為參數傳遞給帶有變數參數的 Java 方法嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-06 16:11:17901瀏覽

Can I Pass an Array as Arguments to a Java Method with Variable Arguments?

我可以將陣列作為參數傳遞給 Java 中帶有變數參數的方法嗎?

在 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!!!
", "[ %s ]"); return String.format(format, args); } public static void main(String... args) { System.out.println(ezFormat("A", "B", "C")); // prints "[ A ][ B ][ C ]" }

變數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;
}

向傳遞的數組添加額外參數對於變量arity方法,您可以使用輔助方法,例如append()和prepend()來修改陣列:

傳遞基元數組
    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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn