Начиная с Java 1.5, формат файла класса был немного изменен (например, для сохранения аннотаций). См. Параметр -target
в документации компилятора . Java 1.5 и более поздние JVM поддерживают оба формата файлов классов; Виртуальные машины Java 1.4 (естественно) поддерживают только более ранний формат.
Что касается того, почему компилятор не жалуется: компилятору нужно только позаботиться о том, достаточно ли у него информации для правильной компиляции файлов, которые его просили скомпилировать; не может ли он запустить их правильно. JVM нужно беспокоиться о правильном запуске классов. По-видимому, если вы видите, что компилятор 1.4 с радостью ссылается на классы 1.5 из кода, который он компилирует, изменение формата не повлияет на информацию, необходимую компилятору для компиляции кода в стиле 1.4. Я не могу сразу найти ссылку, гарантирующую такое поведение, но если это то, что вы видите ...