source1.5允许在接口方法上使用@override?

jfewjypa  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(353)

如果我理解正确(因为 @Override 在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版是非法的。
发生什么事?我是不是误解了1.5规则 @Override ? 或者我误解了什么 -source 1.5 该怎么办?
我注意到了 -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
wwodge7n

wwodge7n1#

看看甲骨文的文档 javac 对于JavaSE8,它说:
...
-震源释放
指定接受的源代码版本。允许以下释放值:
...
1.5
编译器接受包含泛型和JavaSE5中引入的其他语言特性的代码。
5
1.5的同义词。
1.6
JavaSE6中没有引入任何语言更改。但是,源文件中的编码错误现在被报告为错误,而不是java平台标准版早期版本中的警告。
...
注意,该站点说“JavaSE6中没有引入任何语言更改”。因此 @Override 可以用来Assert接口方法被重写似乎不被视为语言更改;相反,在一些Java5SDK编译器中,它以前不被允许的事实可能被认为只是一个bug。
这种行为是纠正的,因为 @Override 可以在编译之后省略,JDK8编译器理解(并验证)注解。因此,注解对所创建的字节码没有任何影响。
-source 1.4 ,我们得到了一个编译错误,因为注解是用Java1.5引入的,因此包含在运行时保留的注解可能会改变程序的行为,编译器不能忽略它们。
如果我们想找到所有与JavaSE5不兼容的地方,我建议您从oracle归档文件下载JavaSE5JDK(尽管您必须创建一个oracle帐户才能这样做),并尝试用这个jdk编译项目。

相关问题