Почему Java 8 может загружать класс Java 9?
У меня есть следующие настройки:
Класс A - скомпилировано с Java 9 (класс версии 53)
Класс B - Должен быть скомпилирован с Java 8 (версия класса 52)
Класс B зависит от класса A.
Теперь я получаю удивительный результат: я могу успешно скомпилировать класс B с Java 8, хотя он имеет зависимость от скомпилированного класса java 9 A.
Если я скомпилирую класс A с Java 10 или Java 11, а затем попробую скомпилировать класс B с Java 8, я получу ожидаемое сообщение об ошибке:
файл класса имеет неправильную версию 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 компилируется с Java 9:
d: \ jdk9 \ bin> javac d: \ test \ A.java
Затем B.java компилируется с Java 8 с использованием класса A, скомпилированного с Java 9:
d: \ jdk8 \ bin> javac -cp d: \ test d: \ test \ B.java
предупреждение: d:\test\A.class: основная версия 53 новее 52, самая высокая основная версия, поддерживаемая этим компилятором.
Рекомендуется обновить компилятор.
1 предупреждение
Таким образом, файл класса успешно скомпилирован с предупреждением. Я только что увидел это предупреждение, вызвав компилятор вручную. Если я использую Maven для создания проекта, это предупреждение не было видно.
Теперь класс 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: ошибка: невозможно получить доступ к A
A classA = новый A ();
^
файл плохого класса: d: \ test \ A.class
файл класса имеет неправильную версию 55.0, должен быть 52.0
Удалите или убедитесь, что он отображается в правильном подкаталоге classpath.
1 ошибка
Таким образом, кажется, что технически возможно использовать скомпилированные файлы классов Java 9 с Java 8. Но я не думал, что это возможно.
1 ответ
Компилятор java 9 javac
вероятно скомпилировано для Java 8; можно использовать более новый компилятор для компиляции для более старой версии.class. Ищите -target и -source 1.8.
Либо IDE, либо maven/gradle был настроен для более старой версии.