8

シェル コマンド プロンプトで と入力するjavac -helpと、-implicitオプションで「... 暗黙的に参照されるファイルのクラス ファイルを生成するかどうか」が指定されていることがわかります。-implicit: noneまたはに対応する 2 つのオプションがありますclass

-implicit:noneまず、 -implicitオプションを使用する場合と使用しない場合の違いは何ですか?

次に、質問のタイトルに関して、提供された例が暗黙的に参照されるファイルとは何かを理解するのに役立つことを望んでいました。どうもありがとう。

4

1 に答える 1

7

Java ドキュメントで十分に説明されています。

最初の質問に対する答えは非常に簡単です。オプションを使用しないのは、使用するの-implicitとほとんど同じ-implicit:classですが (これはオプションのデフォルト値です)、オプションを明示的に使用すると、特定の警告が抑制されます。

注釈処理が完了するまで、コンパイラは一部の型情報の必要性を検出しない場合があります。ソースファイルに型情報があり、-implicitオプションが指定されていない場合、コンパイラは、ファイルが注釈処理の対象外でコンパイルされていることを警告します。警告を無効にするには、コマンド ラインでファイルを指定する (注釈処理の対象となるようにする) か、-implicitオプションを使用して、そのようなソース ファイルに対してクラス ファイルを生成するかどうかを指定します。

次に、2 番目の質問です。ドキュメントに記載されているように:

ソース ファイルをコンパイルするために、コンパイラは多くの場合、型に関する情報を必要としますが、コマンド ラインで指定されたソース ファイルに型定義がありません。コンパイラは、ソース ファイルで使用、拡張、または実装されたすべてのクラスまたはインターフェイスの型情報を必要とします。これには、ソース ファイルで明示的に記述されていないが、継承によって情報を提供するクラスとインターフェイスが含まれます。

たとえば、サブクラス java.applet.Applet を作成すると、Applet の祖先クラスであるjava.awt.Paneljava.awt.Containerjava.awt.Component、およびも使用されjava.lang.Objectます。

Main、ImplicitClass、BaseImplicitClass の 3 つのファイルに 3 つのクラスを作成します。

Main.java:

public class Main {
    public static void main(String[] args) {
        ImplicitClass ec = new ImplicitClass();
        System.out.println(ec.getClass());
    }
}

ImplicitClass.java:

public class ImplicitClass extends BaseImplicitClass {
}

BaseImplicitClass.java:

public class BaseImplicitClass {
}

次のようにコマンドラインからコンパイルすると:

javac -cp . -implicit:class Main.java

また

javac -cp . Main.java

3 つの *.class ファイルがすべて作成されます。

コンパイルすると

javac -cp . -implicit:none Main.java

Main.class のみが作成されます。

コンパイルすると

javac -cp . -implicit:none Main.java ImplicitClass.java

2 つの *.class ファイルが作成されますMain.class(ImplicitClass.classコンパイラImplicitClassに明示的に渡されたため、明示的になりました) が、BaseImplicitClass.classこのクラスが必要なためではなく、暗黙的です。

于 2014-05-07T15:35:22.550 に答える