問題タブ [ecj]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - JDK 9 は、オーバーライドされたメソッドで最終フィールドが参照される Lambda 式のインスタンス化を許可すべきではありませんか?
私は新しい Eclipse Neon で作業しており、コードの一部ですぐにエラーが発生し始めました。
これは最初は奇妙に思えましたが、ここで Neon ECJ (Eclipse Java Compiler) が JDK 9 初期リリース コンパイラの姿勢を採用していることに気付きました。
そのリンクにあるのと同じ問題は発生しませんが、ここで説明する別の問題が発生します。
フィールドとしてのラムダ式宣言に関する問題
これは、Eclipse Neon、JDK 9コンパイラ、および JDK 8 コンパイラ (Eclipse の以前のバージョンではありません) でコンパイル エラーが発生するテスト クラスです。
上記のコードの場合、4 行目のエラーは次のsuffix
とおりです。
宣言の前にsuffix
フィールド宣言を移動すると、同じクラスで何が起こるかを見てみましょう。
addSuffix
上記のコードの場合、6 行目のエラーは次のsuffix
とおりです。
Java 9 はこのように動作する必要がありますか?
これは JDK 8 では問題なく機能しました。突然強制するのは奇妙なことのようです。特に、最終フィールドが正しくインスタンス化されていることを確認するためのコンパイル時のチェックが既に行われていることを考慮してください。
したがって、関数addSuffix
がアクセスされるまでに、値が所定の位置にある必要がありますsuffix
(null
そうでない場合は別の話です)。
また、JDK9 および ECJ で正常にコンパイルされる次のコードを試したことにも注意してください。
JDK 9 では、匿名クラス宣言と Lambda 式の間に大きな違いがあるようです。したがって、コンパイラ エラーが発生した場合、少なくとも ECJ は JDK 9 コンパイラを正確に模倣しています。
ストリームとジェネリックの問題
コード内の Generic が示すものとは異なる方法でコンパイラがこれを解釈する理由が思いつかないため、これには本当に驚きました。
このコードでは、次のエラーが発生します。
この情報に照らして、この場合、JDK 9 を適切に模倣していないことは ECJ に問題があり、単なる Eclipse のバグであることがわかります。
java - インポートされたクラスがサードパーティのライブラリを拡張すると、Java import static が失敗する
問題のセットアップは、3 つの Java ライブラリで構成されています (読みやすくするためにすべてのパッケージ名を削除しました。すべての場所で完全修飾名が使用されています)。
external-lib: 抽象クラスを提供します
/li>my-lib-A: クラスを提供します
external-lib
my-lib-A のクラスパスにあります。my-lib-B は ClassA から 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を変更する場合
コンパイラは満足しています。
ただし (2)、2 つ目の抽象化を追加する場合、my-lib-A のように 2 つ
と
上記の例の 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 で通常のインポートとクラス アクセスをコンパイルできます。