[英]Why can Java 8 load Java 9 class?
我有以下设置:
A类-用Java 9编译(类版本53)
B类-应使用Java 8编译(类版本52)
B类对A类有依赖性。
现在,我得到一个令人惊讶的结果:我可以使用Java 8成功编译Class B,尽管它依赖于Java 9编译的ClassA。
如果我使用Java 10或Java 11编译A类,然后尝试使用Java 8编译B类,则会收到预期的错误消息:
类文件的版本55.0(或54.0)错误,应为52.0
所以有人可以解释为什么我没有收到消息
类文件的版本53.0错误,应为52.0
如果我尝试将Java 8与Java 9类一起使用?
我使用以下Java版本:
Java 8:Oracle jdk 1.8.0_144(安装在文件夹d:\\ jdk8中)
Java 9:Oracle jdk 9.0.1(安装在文件夹d:\\ jdk9中)
Java 11:Oracle jdk 11.0.1(安装在文件夹d:\\ jdk11中)
为了演示它,我创建了这两个类文件:
文件A.java:
public class A {
public void test() {
System.out.println("Class A");
}
}
文件B.java:
public class B {
public static void main(String[] args) {
A classA = new A();
classA.test();
System.out.println("Class B");
}
}
首先用Java 9编译A.java:
d:\\ jdk9 \\ bin> javac d:\\ test \\ A.java
然后,使用使用Java 9编译的类A用Java 8编译B.java:
d:\\ jdk8 \\ bin> javac -cp d:\\ test d:\\ test \\ B.java
警告:d:\\ test \\ A.class:主要版本53比52(该编译器支持的最高主要版本)新。
建议升级编译器。
1警告
因此,该类文件已成功编译并显示警告。 我只是通过手动调用编译器看到了此警告。 如果我使用Maven构建项目,则不会看到此警告。
现在,使用Java 11(与Java 10相同)编译A类:
d:\\ jdk11 \\ bin> javac d:\\ test \\ A.java
如果我尝试编译B类,则会收到错误消息:
d:\\ jdk8 \\ bin> javac -cp d:\\ test d:\\ test \\ B.java
d:\\ test \\ B.java:3:错误:无法访问A
A类=新A();
^
错误的类文件:d:\\ test \\ A.class
类文件的版本55.0错误,应为52.0
请删除或确保它出现在类路径的正确子目录中。
1个错误
因此,从技术上看来,可以将Java 9编译的类文件与Java 8一起使用。但是我认为这是不可能的。
Java 9编译器javac
可能是为Java 8编译的; 可以使用较新的编译器来编译较旧的.class版本。 寻找-target和-source 1.8。
为旧版本配置了IDE或maven / gradle。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.