我有以下设置:
A 类 - 使用 java 9 编译(类版本 53)
B 类 - 应该使用 java 8 编译(类版本 52)
B 类依赖于 A 类。
现在我得到了一个令人惊讶的结果:尽管它依赖于 Java 9 编译的 A 类,但我可以使用 Java 8 成功编译 B 类。
如果我使用 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");
}
}
首先 A.java 用 Java 9 编译:
d:\jdk9\bin>javac d:\test\A.java
然后 B.java 使用 Java 8 编译的使用 Java 9 编译的 A 类:
d:\jdk8\bin>javac -cp d:\test d:\test\B.java
警告:d:\test\A .class:主要版本 53 比 52 新,这是此编译器支持的最高主要版本。
建议升级编译器。
1 个警告
所以类文件编译成功,并带有警告。我刚刚通过手动调用编译器看到了这个警告。如果我使用 Maven 构建项目,则此警告不可见。
现在 Class A 使用 Java 11 编译(与 Java 10 相同):
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: error: cannot access A
A 类A = new A();
^
错误的类文件:d:\test\A.class
类文件的版本错误 55.0,应该是 52.0
请删除或确保它出现在类路径的正确子目录中。
1 个错误
因此,从技术上讲,似乎可以将 Java 9 编译的类文件与 Java 8 一起使用。但我认为这是不可能的。