Почему Java 8 может загружать класс Java 9? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующие настройки:

Класс 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 = new A ();
^
badфайл класса: d: \ test \ A.class
файл класса имеет неправильную версию 55.0, должен быть 52.0
Пожалуйста, удалите или убедитесь, что он отображается в правильном подкаталоге classpath.
1 error

Так что технически возможно использовать скомпилированные файлы классов Java 9 с Java 8. Но я не думал, что это возможно.

1 Ответ

0 голосов
/ 21 декабря 2018

компилятор java 9 javac вероятно скомпилирован для java 8;можно использовать более новый компилятор для компиляции для более старой версии .class.Ищите -target и -source 1.8.

Либо IDE, либо maven / gradle были настроены для более старой версии.

...