6

問題のセットアップは、3 つの Java ライブラリで構成されています (読みやすくするためにすべてのパッケージ名を削除しました。すべての場所で完全修飾名が使用されています)。

  1. external-lib: 抽象クラスを提供します

    public abstract class AbstractExternal {}
    
  2. my-lib-A: クラスを提供します

    public class ClassA extends AbstractExternal {
        public static final String FOO = "foo";
    }
    

    external-libmy-lib-A のクラスパスにあります。

  3. my-lib-B は ClassA から FOO を静的にインポートします。

    import static ClassA.FOO;
    public class ClassB {
        private String foo = FOO;
    }
    

    my-lib-Amy-lib-B のクラスパスにありますが、external-libそうではありません。

問題: このimport static行で次のエラーが発生します。

The type AbstractExternal cannot be resolved. It is indirectly referenced from required .class files.

ただし(1)、ClassBを変更する場合

import ClassA;
public class ClassB {
    private String foo = ClassA.FOO;
}

コンパイラは満足しています。

ただし (2)、2 つ目の抽象化を追加する場合、my-lib-A のように 2 つ

public class AbstractClassA extends AbstractExternal {}

public class ClassA extends AbstractClassA {
    public static final String FOO = "foo";
}

上記の例の ClassA.FOO の静的インポートは機能します。

質問 1: なぜ動作中にimport static ClassA.FOO失敗するのですか?import ClassAClassA.FOO

import static ClassA.FOO質問 2: my-lib-A から別のクラスを拡張してから AbstractExternal を拡張すると、なぜ機能するのですか?

編集: 重要な情報: 問題のコンパイラはEclipse Compiler for Java (ECJ) です。

編集 2: javac は ECJ と同期しており、静的インポートが失敗している間、ClassB で通常のインポートとクラス アクセスをコンパイルできます。

4

1 に答える 1