Java ドキュメントで十分に説明されています。
最初の質問に対する答えは非常に簡単です。オプションを使用しないのは、使用するの-implicit
とほとんど同じ-implicit:class
ですが (これはオプションのデフォルト値です)、オプションを明示的に使用すると、特定の警告が抑制されます。
注釈処理が完了するまで、コンパイラは一部の型情報の必要性を検出しない場合があります。ソースファイルに型情報があり、-implicit
オプションが指定されていない場合、コンパイラは、ファイルが注釈処理の対象外でコンパイルされていることを警告します。警告を無効にするには、コマンド ラインでファイルを指定する (注釈処理の対象となるようにする) か、-implicit
オプションを使用して、そのようなソース ファイルに対してクラス ファイルを生成するかどうかを指定します。
次に、2 番目の質問です。ドキュメントに記載されているように:
ソース ファイルをコンパイルするために、コンパイラは多くの場合、型に関する情報を必要としますが、コマンド ラインで指定されたソース ファイルに型定義がありません。コンパイラは、ソース ファイルで使用、拡張、または実装されたすべてのクラスまたはインターフェイスの型情報を必要とします。これには、ソース ファイルで明示的に記述されていないが、継承によって情報を提供するクラスとインターフェイスが含まれます。
たとえば、サブクラス java.applet.Applet を作成すると、Applet の祖先クラスであるjava.awt.Panel
、
java.awt.Container
、java.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
このクラスが必要なためではなく、暗黙的です。