0

我有以下设置:

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 用 Ja​​va 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 一起使用。但我认为这是不可能的。

4

1 回答 1

1

java 9 编译器javac可能是为 java 8 编译的;可以使用较新的编译器为较旧的 .class 版本进行编译。寻找-target-source 1.8。

IDE 或 maven/gradle 配置为旧版本。

于 2018-12-21T10:25:15.220 回答