Это, вероятно, вызвано тонким изменением правил проверки типов для обобщений между Java 7 и Java 8, как описано в Почему эта программа компилируется с Java 7, но не с Java 8?
Так в чем же решение?
Я сомневаюсь, что вы найдете магический переключатель компилятора или что-то такое, что заставит его работать.На самом деле, я думаю, что вы можете выбрать:
Вы можете просто скомпилировать на платформе Java 7, как и в начале.Но это не хорошее долгосрочное решение.
Если это поддерживаемый продукт, подайте запрос в службу поддержки.
Если этопродукт с открытым исходным кодом, проверьте средство проверки проблем продукта, чтобы увидеть, если кто-то уже сообщил о проблеме.Возможно, они также сообщили об исправлении.
Посмотрите на исходный код, который вы пытаетесь скомпилировать, определите причину ошибки компиляции и исправьте ее.Если это продукт с открытым исходным кодом, отправьте исправление в виде исправления.
Обратите внимание, что возможно, что эти ошибки компиляции сообщают о скрытой ошибке, которая может при некоторых обстоятельствах привести к неожиданному времени выполненияисключения.
Вы сказали:
Я думал, sourceCompatibility = 1.7 установит Java 7 для компиляции * .java.
Это делает,Тем не менее, существуют степени совместимости.
Когда вы запускаете компилятор Java 8 с -source 1.7
, вы фактически просто отключаете поддержку новых языковых функций.Под капотом компилятор все еще остается компилятором Java 8.Если произошли незначительные изменения (например) средства проверки типов, вполне вероятно, что инженеры Java не реализовали режим обратной совместимости для старого поведения.
(Дополнительный режим может сделать и без того сложный компонент программного обеспечения слишком сложным в обслуживании. Проверка типов и вывод типов являются одним из наиболее сложных аспектов реализации компилятора.)