有人能提供一个 javac 的 -implicit 选项如何工作的示例吗?

9
在shell命令提示符下,如果我输入javac -help,则会告诉我-implicit选项指定“...是否为隐含引用文件生成类文件”。 还有两个与-implicit相关的选项:noneclass
首先,使用-implicit:none和不使用-implicit选项有什么区别?
其次,关于我的问题标题,我希望提供一个示例来帮助我了解隐式引用的文件是什么。谢谢。
1个回答

10
您已经在Java文档中很好地描述了它。
对于您的第一个问题,答案非常简单。不使用-implicit选项几乎就像使用-implicit:class(这是该选项的默认值),但通过明确使用该选项,您可以抑制某些警告:
编译器可能直到注释处理完成后才会发现某些类型信息的需求。当在源文件中找到类型信息且未指定-implicit选项时,编译器会发出警告,指出正在编译文件而没有被注释处理。要禁用警告,请在命令行上指定该文件(以便进行注释处理)或使用-implicit选项来指定是否应为此类源文件生成类文件。
现在回答您的第二个问题。正如文档所述:
编译器经常需要有关类型的信息来编译源文件,但是类型定义不在命令行上指定的源文件中。编译器需要每个在源文件中使用、扩展或实现的类或接口的类型信息。这包括在源文件中未显式提及但通过继承提供信息的类和接口。
例如,当您创建一个子类java.applet.Applet时,您还使用Applet的祖先类:java.awt.Paneljava.awt.Containerjava.awt.Componentjava.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.classImplicitClass.class(因为已经显式传递给编译器,所以ImplicitClass现在已成为显式类),但没有创建BaseImplicitClass.class,因为该类是隐式的,但实际上是需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接