Java では、変数引数メソッド (変数を持つメソッド引数) は省略記号 (...) を使用して、メソッドが可変数の引数を受け入れることを示します。配列を可変引数メソッドに渡すと、配列要素はそのメソッドへの個別の引数として扱われます。
次のコードを考えてみましょう。
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 では次のように規定されています。
"If the last仮パラメータが型 T の変数アリティ パラメータである場合、メソッドは型 T[] の仮パラメータを定義すると見なされます。 "
これを説明するために、次のコード スニペットは、引数として配列を変数引数メソッドに渡す方法を示しています。
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!!!
この例では、ezFormat メソッドは変数を取ります。引数の数を返し、フォーマットされた文字列を返します。 String.format は可変引数メソッドでもあるため、ezFormat に渡される各引数は String.format への個別の引数として扱われます。
null 値を変数アリティ メソッドに渡すときは、次の最後のステートメントに注意することが重要です。例:
count(new Object[] { null }); // prints "1" count((Object) null); // prints "1"
...NullPointerException が発生します。これを回避するには、次のように null 引数を別の配列またはオブジェクトとして渡すことができます。
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; }
渡される配列に追加の引数を追加するには変数アリティ メソッドに対して、append() や prepend() などのヘルパー メソッドを使用して、 array:
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 中国語 Web サイトの他の関連記事を参照してください。