Java documentation 中已经很好地描述了它。
第一个问题的答案很简单。不使用-implicit 选项几乎就像使用-implicit:class(这是该选项的默认值),但是通过显式使用该选项可以抑制某些警告:
编译器可能不会发现需要某些类型信息
直到注释处理完成之后。当类型信息
在源文件中找到并且未指定 -implicit 选项,则
编译器会发出警告,说明文件正在被编译而没有被编译
进行注释处理。要禁用警告,要么
在命令行上指定文件(以便它受制于
注解处理)或使用-implicit选项指定是否
或者不应该为这些源文件生成类文件。
现在你的第二个问题。正如文档所述:
为了编译一个源文件,编译器通常需要关于一个源文件的信息
类型,但类型定义不在指定的源文件中
命令行。编译器需要每个类的类型信息
或在源文件中使用、扩展或实现的接口。这
包括源代码中未明确提及的类和接口
文件,但通过继承提供信息。
例如,当你创建一个子类 java.applet.Applet 时,你是
还使用 Applet 的祖先类:java.awt.Panel,
java.awt.Container、java.awt.Component 和 java.lang.Object。
让我们在三个文件中包含三个类: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 {
}
当你像这样从命令行编译它们时:
javac -cp . -implicit:class Main.java
或
javac -cp . Main.java
所有三个 *.class 文件都已创建。
编译时
javac -cp . -implicit:none Main.java
只创建 Main.class。
编译时
javac -cp . -implicit:none Main.java ImplicitClass.java
创建了两个 *.class 文件,Main.class 和 ImplicitClass.class(ImplicitClass 现在已变得显式,因为它已显式传递给编译器),但不是 BaseImplicitClass.class,因为需要此类,但是是隐含的。