Java6,7で可変長引数を持つメソッドをオーバーロードしている際にコンパイル結果が違う時がある
コンパイル結果の違うソース
上記のソースをJDK6のjavac、JDK7のJavacでそれぞれコンパイルすると、結果が違うことがわかる。
JDK6
D:\dev\Java>javac.exe CompileResultDiffTest.java D:\dev\Java>
JDK7
D:\dev\Java>javac.exe CompileResultDiffTest.java CompileResultDiffTest.java:6: エラー: testの参照はあいまいです。Compil eResultDiffTestのメソッド test(int,Object...)とCompileResultDiffTestのメソッド test(Object...)が両方適合します test(0, "a"); ^ エラー1個 D:\dev\Java>
同じクラスの可変長引数をもつメソッドをオーバーロードしているメソッドで
他に用意されている引数が可変長引数のクラスにオートボクシング出来る場合に
Java7ではあいまいエラーとして解釈するようになった?
そもそもそんなオーバーロードするなという話でもあるが……。
eclipse側の問題
eclipseのコンパイラがJDKのコンパイラと別のモノだというのは下記サイトとかにある。
http://www.myeclipseide.jp/blog/2009/06/eclipse-jdt.html
http://feather.cocolog-nifty.com/weblog/2004/08/eclipsej2sdk.html
eclipseでコンパイルする際にどのJDKバージョンに従うかは、設定(Java>コンパイラ)でコンパイラー準拠レベルを設定すればよい。
しかし、コンパイラー準拠レベルの設定にかかわらず、上記ソースのコンパイル結果は以下のようになる。*1
バージョン | 曖昧エラー発生有無 |
---|---|
eclipse3.7(Indigo) | あいまいエラーは発生しない |
eclipse4.2(Juno) | あいまいエラーが発生する |
そのため、Java7を使って開発するけど、eclipseはどんなバージョンでも構わない という場合に
Indigoを使って書いたコードが、Junoでコンパイル通らない、という状況が発生する場合があるので、
気をつけたほうが良いかもしれない。
*1:Indigo以前のバージョンは試していない。