仕様に見当たりません。
↓可変長引数は、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は始めて数ヶ月なので、もっと基礎的な部分で 理解できていない場合は、その旨 ご指摘下さい。
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}).
の部分であるように考えます。
ここでパラメータがまでしかない場合(k == n - 1 の場合)、new T[]{} として初期化される=要素数0の配列が与えられる、ということではないかと。
呼び出されたメソッドは空の配列が渡されるようなのですが
正確に書くと、「要素数ゼロの配列が渡される」のです。
真面目に従うと 要素数0の配列を渡さないといけない(?)のですが
いいえ、違います。
メソッドに自動的に「要素数ゼロの配列が渡される」のであって、渡す側が要素数ゼロの配列を用意する必要はありません。
詳しくは下記ページをご覧下さい。
http://www.techscore.com/tech/Java/JavaSE/JavaLanguage/6/
そうなのです。ところが、引数を渡さなかった時に 「要素数ゼロの配列が渡る」という動作は仕様のどこにも見当たらないのです。解説している記事では、当然そのように動作すると記述されているのですが、仕様のどこにそれが書いてあるか見つけられないのです。
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
あたりを起点に確認されるとよいかと。
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}).
の部分であるように考えます。
ここでパラメータがまでしかない場合(k == n - 1 の場合)、new T[]{} として初期化される=要素数0の配列が与えられる、ということではないかと。
おぉ・・。すばらしいです。
この説明であれば、言い切れるとおもいます。
ありがとうございました!
ごく個人的な感想としては、今の挙動をあてにしてプログラミングするのは(特に長くメンテナンスする予定があるのなら)避けた方がいいような感じがしました。
可変長引数が無い同名のメソッドを別に作った方が、見通しがよくなるんじゃないでしょうか。
おぉ・・。すばらしいです。
2012/10/09 21:26:59この説明であれば、言い切れるとおもいます。
ありがとうございました!
ごく個人的な感想としては、今の挙動をあてにしてプログラミングするのは(特に長くメンテナンスする予定があるのなら)避けた方がいいような感じがしました。
2012/10/10 00:59:51可変長引数が無い同名のメソッドを別に作った方が、見通しがよくなるんじゃないでしょうか。