「メソッド xxx は 型 Abc であいまいです」エラーが環境によってでるとかでないとか。

今さら感つよめな内容ですが・・・

EclipseJava開発で、「メソッド 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)

f:id:vemi:20200329024402p:plain:w350

補足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 であいまいです」エラーが環境によってでるとかでないとか。