有人能举例说明javac的-implicit选项是如何工作的吗?

时间:2014-05-07 14:42:40

标签: java compiler-options

在shell命令提示符下,如果我输入javac -help,它会告诉我-implicit选项指定“...是否为隐式引用的文件生成类文件”。 -implicit: noneclass有两种选择。

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

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

1 个答案:

答案 0 :(得分:5)

你在Java documentation中已经很好地描述了它。

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

  

编译器可能不会发现某些类型信息的需要   直到注释处理完成。当类型信息   在源文件中找不到,并且没有指定-implicit选项   编译器发出警告,表明文件正在编译而不是   受注释处理。要禁用警告,也可以   在命令行上指定文件(以便它将受到限制   注释处理)或使用-implicit选项指定是否   或者不应该为这些源文件生成类文件。

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

  

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

     

例如,当你创建一个子类java.applet.Applet时,你就是   还使用Applet的祖先类:java.awt.Panel,   java.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.classImplicitClass现已变为显式,因为它已显式传递给编译器),但不是{{1}因为这个类是必需的,但却是隐含的。