簡體   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