8

在 shell 命令提示符下,如果我输入javac -help,它会告诉我该-implicit选项指定“...是否为隐式引用的文件生成类文件”。有两个选项与-implicit: none或一起使用class

-implicit:none首先,使用和不使用 -implicit选项有什么区别?

其次,关于我的问题标题,我希望提供的示例可以帮助我理解隐式引用的文件是什么。非常感谢。

4

1 回答 1

7

您在Java 文档中对它进行了很好的描述。

你的第一个问题的答案很简单。不使用该-implicit选项几乎就像使用-implicit:class(这是该选项的默认值),但通过显式使用该选项可以抑制某些警告:

在注释处理完成之前,编译器可能不会发现需要某些类型信息。当在源文件中找到类型信息并且未-implicit指定任何选项时,编译器会发出警告,说明文件正在编译,但未经过注释处理。要禁用警告,请在命令行上指定文件(以便对其进行注释处理)或使用-implicit选项指定是否应为此类源文件生成类文件。

现在你的第二个问题。正如文档所述:

要编译源文件,编译器通常需要有关类型的信息,但类型定义不在命令行指定的源文件中。编译器需要源文件中使用、扩展或实现的每个类或接口的类型信息。这包括源文件中未明确提及但通过继承提供信息的类和接口。

例如,当您创建子类 java.applet.Applet 时,您还使用了 Applet 的祖先类:java.awt.Paneljava.awt.Containerjava.awt.Componentjava.lang.Object

让我们在三个文件中包含三个类:Main、ImplicitClass、BaseImplicitClass。

主.java:

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

隐式类.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.classImplicitClass现在已变得显式,因为它已显式传递给编译器),但不是BaseImplicitClass.class因为需要此类,而是隐式的。

于 2014-05-07T15:35:22.550 回答