繁体   English   中英

为什么Java 8可以加载Java 9类?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM