У меня есть следующие настройки:
Класс 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. Но я не думал, что это возможно.