人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaの可変長引数で、可変長引数をとるメソッドに何も引数を渡さなかった場合、呼び出されたメソッドは空の配列が渡されるようなのですが
仕様に見当たりません。

↓可変長引数は、Java1.5で導入されたようです。
http://docs.oracle.com/javase/1.5.0/docs/relnotes/features.html

↓JSR201(?)にも見当たりませんでした。
http://jcp.org/aboutJava/communityprocess/final/jsr201/index.html

なので、真面目に従うと 要素数0の配列を渡さないといけない(?)のですが
引数を無しで呼び出しても、コンパイラに怒られないし 呼び出しも上手くいってしまいます。

仕様上OKなのかどうか、気になって夜も眠れません。どなたか説明できる方、いらっしゃいますでしょうか?
Javaは始めて数ヶ月なので、もっと基礎的な部分で 理解できていない場合は、その旨 ご指摘下さい。

●質問者: office55
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● oil999
●0ポイント

呼び出されたメソッドは空の配列が渡されるようなのですが

正確に書くと、「要素数ゼロの配列が渡される」のです。

真面目に従うと 要素数0の配列を渡さないといけない(?)のですが

いいえ、違います。
メソッドに自動的に「要素数ゼロの配列が渡される」のであって、渡す側が要素数ゼロの配列を用意する必要はありません。

詳しくは下記ページをご覧下さい。
http://www.techscore.com/tech/Java/JavaSE/JavaLanguage/6/


office55さんのコメント
そうなのです。ところが、引数を渡さなかった時に 「要素数ゼロの配列が渡る」という動作は仕様のどこにも見当たらないのです。解説している記事では、当然そのように動作すると記述されているのですが、仕様のどこにそれが書いてあるか見つけられないのです。

2 ● nattow
●0ポイント

Java の言語仕様を調べたい場合はまず Java Language Specification(http://docs.oracle.com/javase/specs/)を確認されるとよいです。

ご質問の件は恐らく
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.3
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12
あたりを起点に確認されるとよいかと。


3 ● quintia
●100ポイント ベストアンサー

The Java Language Specification, Third Edition
http://docs.oracle.com/javase/specs/jls/se5.0/html/j3TOC.html

仕様は 15.12.2.4 から 15.12.2.5
http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#301239
にかけてかと思うんですが、仰るとおり、可変長パラメータにあたる部分を与えない場合にどうなるかは書かれていないように見えます(自信はないのですが……)。

現在の挙動の根拠になっているのは、15章 Expressions の 15.12.4.2 の
http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#45449

If the method being invoked is a variable arity method (§8.4.1) m, it necessarily has n>0 formal parameters. The final formal parameter of m necessarily has type T[] for some T, and m is necessarily being invoked with k0 actual argument expressions.

If m is being invoked with kn actual argument expressions, or, if m is being invoked with k=n actual argument expressions and the type of the kth argument expression is not assignment compatible with T, then the argument list (e1, ... , en-1, en, ...ek) is evaluated as if it were written as (e1, ..., en-1, new T{en, ..., ek}).

の部分であるように考えます。
ここでパラメータがe_{n-1}までしかない場合(k == n - 1 の場合)、new T[]{} として初期化される=要素数0の配列が与えられる、ということではないかと。


quintiaさんのコメント
検索してたら同じ質問に同じ箇所を答えているのを見つけました。 http://stackoverflow.com/questions/10905942/which-part-of-the-java-language-specification-describes-the-behaviour-of-omitted

office55さんのコメント
おぉ・・。すばらしいです。 この説明であれば、言い切れるとおもいます。 ありがとうございました!

quintiaさんのコメント
ごく個人的な感想としては、今の挙動をあてにしてプログラミングするのは(特に長くメンテナンスする予定があるのなら)避けた方がいいような感じがしました。 可変長引数が無い同名のメソッドを別に作った方が、見通しがよくなるんじゃないでしょうか。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ