読者です 読者をやめる 読者になる 読者になる

Java6,7で可変長引数を持つメソッドをオーバーロードしている際にコンパイル結果が違う時がある

Java eclipse tech

コンパイル結果の違うソース

上記のソースを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以前のバージョンは試していない。