Sie haben es sehr gut in der Java documentation beschrieben.
Die Antwort auf Ihre erste Frage ist ziemlich einfach. Nicht mit der -implicit
Option ist fast wie -implicit:class
mit (das ist der Standardwert der Option ist), sondern explizit mit der Option unterdrücken Sie bestimmte Warnung:
Der Compiler nicht die Notwendigkeit für irgendeine Art Informationen entdecken könnten bis nach Abschluss der Annotationsverarbeitung. Wenn die Typinformation in einer Quelldatei gefunden wird und keine -implicit
-Option angegeben ist, gibt der Compiler eine Warnung aus, dass die Datei kompiliert wird, ohne dass sie der Annotationsverarbeitung unterliegt ( ). Um die Warnung zu deaktivieren, geben Sie die Datei in der Befehlszeile an (so dass sie der Annotationsverarbeitung unterliegt) oder verwenden Sie die Option -implicit
, um anzugeben, ob für solche Quelldateien oder keine Klassendateien generiert werden sollen.
Jetzt Ihre zweite Frage. Da die Dokumentation heißt es:
eine Quelldatei zu kompilieren, muss der Compiler häufig Informationen über einen Typ, aber die Typdefinition ist nicht in den Quelldateien auf die Befehlszeile angegeben. Der Compiler benötigt Typinformationen für jede Klasse oder verwendete, erweiterte oder implementierte Schnittstelle in der Quelldatei. Diese enthält Klassen und Schnittstellen, die in der Quelldatei nicht explizit erwähnt sind, aber Informationen durch Vererbung bereitstellen.
Zum Beispiel, wenn Sie eine Unterklasse java.applet.Applet erstellen, Sie sind auch die Vorfahren Klassen Applet mit: java.awt.Panel
, java.awt.Container
, java.awt.Component
und java.lang.Object
.
Wir haben drei Klassen in drei Dateien: Main, ImplicitClass, BaseImplicitClass.
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 {
}
Wenn man sie von der Kommandozeile wie folgt zusammenstellen:
javac -cp . -implicit:class Main.java
oder
javac -cp . Main.java
alle drei * .class-Dateien erstellt werden.
Beim Kompilieren es
javac -cp . -implicit:none Main.java
nur Main.class erstellt wird.
Wenn Sie es kompilieren
javac -cp . -implicit:none Main.java ImplicitClass.java
zwei * .class-Dateien erstellt werden, Main.class
und ImplicitClass.class
(die ImplicitClass
jetzt explizit geworden ist, weil es an den Compiler explizit übergeben wurde), aber nicht BaseImplicitClass.class
als dieser Klasse wird benötigt, ist aber implizit.