問題のセットアップは、3 つの Java ライブラリで構成されています (読みやすくするためにすべてのパッケージ名を削除しました。すべての場所で完全修飾名が使用されています)。
external-lib: 抽象クラスを提供します
public abstract class AbstractExternal {}
my-lib-A: クラスを提供します
public class ClassA extends AbstractExternal { public static final String FOO = "foo"; }
external-lib
my-lib-A のクラスパスにあります。my-lib-B は ClassA から FOO を静的にインポートします。
import static ClassA.FOO; public class ClassB { private String foo = FOO; }
my-lib-A
my-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 ClassA
ClassA.FOO
import static ClassA.FOO
質問 2: my-lib-A から別のクラスを拡張してから AbstractExternal を拡張すると、なぜ機能するのですか?
編集: 重要な情報: 問題のコンパイラはEclipse Compiler for Java (ECJ) です。
編集 2: javac は ECJ と同期しており、静的インポートが失敗している間、ClassB で通常のインポートとクラス アクセスをコンパイルできます。