【问题标题】:Can someone provide an example of how javac's -implicit option works?有人可以提供一个 javac 的 -implicit 选项如何工作的例子吗?
【发布时间】:2014-05-07 14:42:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: java compiler-options


    【解决方案1】:

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

    第一个问题的答案很简单。不使用-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.classImplicitClass 现在已变得显式,因为它已显式传递给编译器),但不是 BaseImplicitClass.class,因为需要此类,但是是隐含的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 2014-06-04
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多