首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java 8可以加载Java 9类?

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

Stack Overflow用户
提问于 2018-12-21 16:39:35
回答 1查看 422关注 0票数 0

我有以下设置:

A类-使用java 9编译(类版本53)

B类-应使用java 8(类版本52)进行编译

类B与类A有依赖关系。

现在我得到了一个令人惊讶的结果:我可以成功地使用Java 8编译B类,尽管它依赖于java 9编译的类A。

如果我用Java 10或Java 11编译A类,然后尝试用Java 8编译B类,我会得到预期的错误消息:

类文件的版本55.0 (或54.0)错误,应为52.0

有没有人能解释一下为什么我不明白

类文件版本53.0错误,应为52.0

如果我尝试将Java 8与Java 9类一起使用?

我使用这个java版本:

Java8: 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:

代码语言:javascript
复制
public class A {
    public void test() {
        System.out.println("Class A");
    }
}

文件B.java:

代码语言:javascript
复制
public class B {
    public static void main(String[] args) {
        A classA = new A();
        classA.test();

        System.out.println("Class B");
    }
}

第一个A.java是用Java9编译的:

d:\jdk9\bin>javac d:\test\A.java

然后,使用Java9编译的A类使用Java8编译B.java:

测试-cp d:\ d:\jdk8\bin>javac d:\test\B.java

警告: d:\test\A.class:主版本53比52新,52是此编译器支持的最高主版本。

建议升级编译器。

1个警告

因此,类文件编译成功,但会出现警告。我刚刚通过手动调用编译器看到了这个警告。如果我使用Maven构建项目,则看不到此警告。

现在使用Java 11编译了A类(与Java 10相同):

d:\jdk11\bin>javac d:\test\A.java

如果我试图编译B类,我得到一个错误:

测试-cp d:\ d:\jdk8\bin>javac d:\test\B.java

d:\test\B.java:3:错误:无法访问A

代码语言:javascript
复制
     A classA = new A();
代码语言:javascript
复制
     ^

错误的类文件: d:\test\A.class

代码语言:javascript
复制
 class file has wrong version 55.0, should be 52.0
代码语言:javascript
复制
 Please remove or make sure it appears in the correct subdirectory of the classpath.

1个错误

因此,从技术上讲,在Java 8中使用Java 9编译的类文件是可能的,但我认为这是不可能的。

EN

回答 1

Stack Overflow用户

发布于 2018-12-21 18:25:15

Java9编译器javac可能是为Java8编译的;您可以使用较新的编译器来编译较旧的.class版本。查找-target-source 1.8。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53881551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档