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は始めて数ヶ月なので、もっと基礎的な部分で 理解できていない場合は、その旨 ご指摘下さい。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/10/09 21:27:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:quintia No.3

回答回数562ベストアンサー獲得回数71

ポイント100pt

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の配列が与えられる、ということではないかと。

他1件のコメントを見る
id:office55

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

2012/10/09 21:26:59
id:quintia

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

2012/10/10 00:59:51

その他の回答2件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

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

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

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

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

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

id:office55

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

2012/10/08 16:29:57
id:nattow No.2

回答回数102ベストアンサー獲得回数27

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
あたりを起点に確認されるとよいかと。

id:quintia No.3

回答回数562ベストアンサー獲得回数71ここでベストアンサー

ポイント100pt

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の配列が与えられる、ということではないかと。

他1件のコメントを見る
id:office55

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

2012/10/09 21:26:59
id:quintia

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

2012/10/10 00:59:51

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません