web-dev-qa-db-ja.com

-sourceと-targetの互換性の違いは何ですか?

Javaコンパイラ(javac)を使用する場合、2種類の互換性を指定できます。1つは-sourceを使用しており、もう1つは-targetを使用しています。これら2つの違いは何ですか?

たとえば、-source 1.5および-target 1.6

また、異なるソースとターゲットの互換性レベルを使用するケースはありますか?

40
Adam Lee

javac docs から:

-source受け入れられるソースコードのバージョンを指定します。

-target指定されたバージョンのVMをターゲットとするクラスファイルを生成します。クラスファイルは、指定されたターゲットとそれ以降のバージョンで実行されますが、以前のバージョンのVMでは実行されません。

あなたの例では:

-source 1.5 and -target 1.6

これは、ソースコードがJDK 1.5と互換性があることを確認するために使用されますが、JDK 1.6以降で使用するクラスファイルを生成する必要があります。

かなりなぜこれを行うのかは別の問題です。

35
skaffman

-sourceは、ソースコードのコンプライアンスレベルを示します。注釈を使用していますか?次に、少なくとも1.5;使っていますか @overrideインターフェースの実装では、1.6など

-targetは、クラスを実行できるようにするJavaバージョンを指定します。Java SE 7コンパイラとコンパイルJava SE 1.5

11
raphaëλ

これは主に、古いバージョンのJavaで動作するjarファイルを生成するのに役立ちます。これまでのところ、すべてのJDKで古いバージョンを実行することもできるので、ソースよりも大きなターゲットにする理由はありません。

ただし、targetを次のように設定することには意味があります。 1.7 JDKを使用する場合は1.6。

確かではありませんが、1.7 Javaコードを1.7コンパイラを使用して1.6 jarにコンパイルすることは、たとえば次のような式でうまくいくと思います

ArrayList<Integer> foo = new ArrayList<>();

1.7+ソースバージョンでのみ有効なものは、1.6互換のバイトコードにコンパイルする必要があります。しかし、コンパイラが実際にこれを行うかどうかは確認していません。 残念ながら、これは実際には実装されていないようです。