ProgrammingバックエンドJava開発者

Javaにおけるvarargs(可変長引数)とは何か、それらの内部実装はどのように機能するか、使用時の注意点や制約は何か?

Hintsage AIアシスタントで面接を突破

回答

Varargsは、メソッドが同じ型の可変(任意の)数の引数を受け取ることを可能にする特別な構文です。メソッドの宣言では、そのパラメータはType... name(例えば、int... nums)として示されます。メソッド内部では、引数は通常の配列として扱われます。

例:

public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }

メソッドは次のように呼び出すことができます:

printNumbers(1, 2, 3, 4); // または printNumbers();

内部実装: varargsを持つメソッドを呼び出すと、コンパイラは自動的に対応する型の配列を生成します。

制約と注意点:

  • Varargsパラメータは1つだけであり、常にパラメータリストの最後にある必要があります。
  • Varargs(Type...)は本質的に配列(Type[])です。
  • nullを渡すこと: printNumbers(null)は、反復処理を試みるとNPEを引き起こします。
  • Varargsを持つメソッドのオーバーロードは、呼び出しの曖昧さを引き起こす可能性があります。

ひっかけ質問

質問:「複数のvarargsパラメータを持つメソッドを宣言できますか?」

よくある誤解:多くの人は、public void example(int... a, String... b)を宣言できると考えますが、これによりコンパイルエラーが発生します。

正しい答え:いいえ、varargsパラメータは1つだけが可能であり、それは最後でなければなりません。

このトピックの詳細を知らないことによる実際のエラーの例


ストーリー

企業のロギングライブラリには、varargsおよび配列を持つオーバーロードされたメソッドのバージョンが実装されました。配列を要素のセットの代わりに渡すと、誤ったメソッドが選択され、配列がオブジェクトとして記録され、その内容としてではなく、ログ解析時に混乱を引き起こしました。


ストーリー

統合サービスでは、varargsを持つメソッドがnullを受け入れ、NPEを確認せずに要素を反復処理しようとしたため、システムは予期せず「クラッシュ」しました。少なくとも空の配列が期待されていました。


ストーリー

あるeコマースプロジェクトでは、メソッドのオーバーロードで混乱しました:send(String subject, String... emails)というメソッドとsend(String subject, String[] emails)という別のメソッドがありました。配列を渡すと、コンパイラは不適切なメソッドを暗黙的に選択しました。結果として、メールが顧客に送信されませんでした。