【问题标题】:Why is javac -source 1.5 allowing @Override on interface methods?为什么 javac -source 1.5 允许在接口方法上使用 @Override?
【发布时间】:2020-08-22 23:06:55
【问题描述】:

如果我理解正确,这里有一些示例 java 代码在 1.5 下是非法的 (自@Override could not be used for overrides of interface methods until java 1.6):

public class A { 
  public static interface MyInterface { 
    public void myInterfaceMethod();
  }
  public static class MyClass implements MyInterface { 
    @Override public void myInterfaceMethod() {}
  }
} 

我想在我的源代码中找到所有这些与 1.5 不兼容的地方, 所以我在我的 ubuntu linux 机器上安装了一个支持 java1.5 的编译器:

sudo apt install openjdk-8-jdk
JAVAROOT=/usr/lib/jvm/java-1.8.0-openjdk-amd64
${JAVAROOT}/bin/javac -version
# javac 1.8.0_232

并编译了上面的java源码:

${JAVAROOT}/bin/javac -source 1.5 -Xlint:all -Xlint:-options A.java

我预计上面的 java 代码会被拒绝。但它 尽管在 1.5 下是非法的,但显然编译成功。

发生了什么事?我是否误解了关于@Override 的1.5 规则? 还是我误解了-source 1.5 应该做什么?

FWIW,我注意到 -source 1.4 确实给出了预期的错误:

${JAVAROOT}/bin/javac -source 1.4 -Xlint:all -Xlint:-options A.java
A.java:6: error: annotations are not supported in -source 1.4
      @Override public void myInterfaceMethod() {}
       ^ 
  (use -source 5 or higher to enable annotations)
1 error

【问题讨论】:

  • 为什么? Java 1.5 于 2004 年 9 月 30 日发布。在源代码级别与这么旧的版本保持严格兼容的目的是什么?
  • @ElliottFrisch 我选择哪些 java 版本以使我的代码兼容是一个判断调用,而不是重点。我担心的是,我希望能够就我的源代码兼容的 Java 编译器版本范围做出/发布一个简单而准确的声明,以供可能使用各种编译器版本编译它的人使用。目前我似乎无法判断我的代码是否符合 1.5。
  • @DonHatch 您可以从 oracles 网站下载 Java SE5 JDK。我已将其链接在答案的底部。

标签: java java-6 java-5


【解决方案1】:

看着Oracle's documentation of javac for Java SE8 它说:

...

-来源发布

指定接受的源代码版本。允许使用以下释放值:

...

  • 1.5

    编译器接受包含 Java SE 5 中引入的泛型和其他语言特性的代码。

  • 5

    1.5 的同义词。

  • 1.6

    Java SE 6 中没有引入任何语言更改。但是,源文件中的编码错误现在报告为错误,而不是像早期版本的 Java Platform, Standard Edition 中的警告。

...

请注意,该网站说“Java SE 6 中没有引入任何语言更改”。因此,@Override 可用于断言接口方法已被覆盖这一事实似乎不被视为语言更改;相反,以前不允许这样做的事实可能只是一些 Java 5 SDK 编译器中的一个错误。

此行为已得到纠正,因为在编译后可以省略 @Override,并且 JDK 8 编译器可以理解(并验证)注释。因此,注释对创建的字节码没有任何影响。

对于-source 1.4,自Annotations were introduced with Java 1.5 以来我们会收到一个编译错误,因此包含在运行时保留的注释可能会改变程序的行为,编译器不得忽略它们。


如果我们想找出所有与 Java SE 5 不兼容的东西,我建议下载 Java SE5 JDK from the Oracle Archive(尽管您必须创建一个 Oracle 帐户才能这样做)并尝试使用此 JDK 编译项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2011-01-21
    • 2011-05-27
    • 2014-06-20
    • 2016-07-28
    • 2016-04-27
    • 2016-10-06
    相关资源
    最近更新 更多