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