問題タブ [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.
generics - Java 8 およびストリーム: Eclipse コンパイラ (ECJ) を使用してタイプが正しく推測されない
私はこのコードを持っています:
メソッドの型パラメーターの場合、Javac または ECJ (その場合) が型を推測するのに失敗する可能性があることを私は知っています。
その特定のケースで、単純なケースのように見えるのに、ECJ が型を正しく推測しないのはなぜですか?
編集: javac(mavenを使用)でテストした後、回答を更新し、それが機能することを確認しました。
編集 (2):コードをリファクタリングしてこれを機能させる:
注: Pair
は commons-lang から取得され、 を実装しMap.Entry
ます。
java - Java8のあいまいなオーバーロード - ECJまたはjavacは正しいですか?
私は次のクラスを持っています:
これは、JDK 7 の javac と eclipse (コンプライアンスを 1.7 または 1.8 に設定) で正常にコンパイルされます。ただし、JDK 8 の javac でコンパイルしようとすると、次のエラーが発生します。
このエラーは、メソッド内のコンストラクター呼び出しではambigous()
なく、メソッド内のコンストラクター呼び出しにのみ適用されることに注意してくださいnotAmbiguous()
。唯一の違いはambiguous()
、ダイヤモンド演算子に依存していることです。
私の質問は次のとおりです。JDK 8 の javac はあいまいな解決策に適切にフラグを立てていますか、それとも JDK 7 の javac はあいまいさをキャッチできませんでしたか? 回答に応じて、JDK バグまたは ecj バグを報告する必要があります。
java - Eclipse で一部の Java 7 言語機能を Java 6 クラス ファイルにコンパイルできるのはなぜですか?
Eclipse (Eclipse コンパイラーを使用) では、Java 7 言語機能をいくつか使用しながら、Java 6 クラス ファイルを作成できることがわかりました。以下の画像では、Java 6 クラス ファイルとして正常にコンパイルされた 2 つの Java 7 言語機能を確認できます。ただし、コメントアウトされているその他の Java 7 機能はコンパイルされません。
私の推測では、Eclipse は、どの Java 7 言語機能が Java 6 JVM と互換性があり、どれが互換性がないかを判断していると思います。たとえば、ジェネリック型の JComboBox は単なるコンパイル機能 (実行時ではない) であるため、どのように互換性があるか想像できます。文字列の切り替え機能は、バイトコードに違いをもたらし、新しいJVM機能に依存していると思いますが、間違っている可能性があります...
私の質問:
Eclipse は、どの Java 7 言語機能が Java 6 クラス ファイルにコンパイル可能で、どれがそうでないかを判断できるほど賢いのでしょうか?
以下の例は明らかに 1.6 ソース互換ではないのに、なぜ「ソース互換」を 1.6 に設定してもエラーにならないのでしょうか?
この「トリック」により、Java 7 言語機能の少なくとも一部を使用しながら、Java 6 クラス ファイルを作成できるようです。ソース 1.7 とターゲット 1.6 で javac を使用すると失敗しますが、なぜこれが機能するのですか? Ecilpse コンパイラには、javac にはない機能がありますか?
比較のために、予想どおり Java 6 コンパイラに切り替えたときの結果を次に示します。
eclipse - ECJ Compiler でコンパイルした後に失われたアノテーション情報
ECJ コンパイラからコンパイルされたバイトコードに、アノテーション情報が欠落していることがわかりました。
javac によってコンパイルされたバイトコードから逆コンパイルされたソース コード:
ECJ によってコンパイルされたバイトコードから逆コンパイルされたソース コード:
@GetAction("/hello")
そのため、ECJ によってコンパイルされたバイトコード (メモリ コンパイル内) には明らかに注釈がありません。
以前にこの問題に遭遇したことがあり、手がかりを得た人はいますか?
より多くの情報で更新
次のスクリーンショットを見てください。
したがって、ASTNode.resolveAnnotations()
メソッドの行 #797 にあります。
A)状態は注釈としてif ((method.tagBits & TagBits.AnnotationResolved) != 0) return annotations;
返されますnull
B) ソース注釈@GetAction("/hello")
が提示されている理由
C)this.annotations
フィールドはnull
、
D) if 条件(method.tagBits & TagBits.AnnotationResolved) != 0
が true と評価される
アップデート 2
画面をキャプチャするのが早すぎたようです。プロセスが完了すると、注釈情報が保存されていることがわかりました。
ただし、結果ファイルから注釈情報を取得することはできません。ここをクリックして、生成されたバイトコード ファイルをダウンロードします。
ECJ 4.4.1 を使用していることに注意してください。
genetic-programming - ECJ における島嶼モデル
遺伝的プログラミング (GP) で、島モデルが使用される場合、それは人口サイズを島間で分割することを意味しますか?
たとえば、パラメータファイルに
4 つの島がありますが、各島の人口は 1000 人になるということですか? このコード行を各島のパラメーター ファイルに入れるとどうなるでしょうか。島ごとに異なる人口規模を持つことは可能ですか?
Java とECJ パッケージを使用して、GP にアイランド モデルを実装しています。
java - javap で逆アセンブルされた Enum にコンストラクターの引数が表示されない
javap で列挙型を逆アセンブルすると、列挙型の暗黙的なコンストラクター引数が欠落しているように見え、その理由がわかりません。
列挙型は次のとおりです。
これを(Java 8u60で)次のコマンドでコンパイルおよび逆アセンブルします。
そして、ここに私が得る出力があります:
私の混乱は、各列挙型定数をインスタンス化するために使用されるプライベートコンストラクターにあります。逆アセンブルは、引数をとらないことを示しています ( private Foo();
) が、確かに引数をとります。たとえばload
、渡された列挙定数の名前と序数、this
およびポインターを読み取り、それらを必要とするスーパークラスのコンストラクターに渡す命令を確認できます。静的イニシャライザ ブロックのコードは、コンストラクタを呼び出す前にこれらの引数をスタックにプッシュすることも示しています。
今、これは javap のあいまいなバグだと思っていたでしょうが、Eclipse のコンパイラでまったく同じ列挙型をコンパイルし、javap を使用してそれを逆アセンブルすると、コンストラクターは引数が表示されていることを除いてまったく同じです。
私の質問は、javac でコンパイルされた列挙型と、javac でコンパイルされた列挙型のコンストラクター引数を javap が表示しない原因となる Eclipse でコンパイルされた列挙型の物理的な違いは何ですか? そして、この違いは (javap、javac、または Eclipse の) バグですか?