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 コンパイラに切り替えたときの結果を次に示します。