如果我理解正确(因为 @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
1条答案
按热度按时间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编译项目。