2014-05-07 10 views
5

An der Shell-Eingabeaufforderung, wenn ich javac -help eintippe, sagt es mir, dass die Option -implicit "... angibt, ob Klassendateien für implizit referenzierte Dateien generiert werden sollen oder nicht". Es gibt zwei Optionen, die zu -implicit:none oder class gehören.Kann jemand ein Beispiel dafür geben, wie die javac-implicit-Option funktioniert?

Erstens, was ist der Unterschied zwischen der Verwendung von -implicit:none und nicht die Option - implicit?

Zweitens hatte ich in Bezug auf meinen Fragetitel gehofft, dass ein bereitgestelltes Beispiel mir helfen würde zu verstehen, was eine implizit referenzierte Datei war. Danke vielmals.

Antwort

5

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.