今さら感つよめな内容ですが・・・
EclipseのJava開発で、「メソッド xxx は 型 Abc であいまいです」エラーが
出る環境と出ない環境がある、という相談を受けました。
普段ならそんなんチャッチャと直しちゃえ!ですが、
大人の都合ですぐに改訂はできない状態だったんですよね。
JDKバージョンは同じ。Javaのエラー/警告の設定も同じ。
差異があるのは、Eclipseのバージョンでした。
結論から言うと、Eclipse 3.x系 と 4.x系 のコンパイルの差異でした。
ネットの情報も薄かったので簡単に検証した結果を書き残します。
検証結果
Eclipseのバージョン | 結果 | 検証バージョン |
---|---|---|
4.x系 | 「あいまい」エラーが出ない | 2019-03(4.11) |
3.x系 | 「あいまい」エラーが出る | 3.7、3.5 |
古いバージョンの Eclipse ではエラーになるということになります。
検証コード
ApiA
package samplepj; public class ApiA { public static String getItem() { return "a"; } }
ApiB
package samplepj; public class ApiB { public static String getItem() { return "b"; } }
Main
package samplepj; import static samplepj.ApiA.*; // ←クラスAをすべて static import import static samplepj.ApiB.*; // ←クラスBをすべて static import import static samplepj.ApiB.getItem; // ←重複した特定のメソッドを static import public class Main { public static void main(String[] args) { System.out.println("ApiA:" + samplepj.ApiA.getItem()); System.out.println("ApiB:" + samplepj.ApiB.getItem()); System.out.println("結果:" + getItem()); } }
実行結果(4.x系)
ApiA:a ApiB:b 結果:b
実行結果(3.x系)
Exception in thread "main" java.lang.Error: Unresolved compilation problem: メソッド getItem() は型 Main であいまいです at samplepj.Main.main(Main.java:12)
補足1、コンパイル仕様について
今回はトラブル事例として書き残しましたが、
「そんな危なっかしいコード書くな(書かせておくな)!」
っていうのが大前提です。
*
による import と メソッド指定による import に優先度がついたものと思われます。
試しに、検証コードの「重複した特定のメソッド」で呼び出すApiを
ApiA に変更してみたところ、結果も変わりました。
実行結果(4.x系)
ApiA:a ApiB:b 結果:a
こんなコードになること自体がめったにないので、勉強になりましたぁ。
import の優先度とかはどこかに出典があっても良さそうだけど、見あたりませんでした。
ご存じの方いらしたら教えてください。
補足2、Eclipseのバージョンの見分け方
Eclipse のバージョン違い、という最初の直感は、
偶然、Eclipse のメニューの背景色によって気になったのでした。
Eclipse のバージョン | 色合い(?) |
---|---|
Eclipse 3.x 系 | 灰色っぽい |
Eclipse 4.x 系 | 薄青っぽい |
「これは・・・ 古い Eclipse ・・・!!」って目印にしています。
#9 「メソッド xxx は 型 Abc であいまいです」エラーが環境によってでるとかでないとか。