Почему 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 был настроен для более старой версии.

Другие вопросы по тегам