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側のコンパイラ
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以前のバージョンは試していない。