Различие связано с версией JDK, для которой вы компилируете (или целевой версией).
Java 8 понимает "эффективно финальные" переменные.Когда вы компилируете с JDK 8, вам не нужно явно объявлять переменную как final
, чтобы ссылаться на нее в анонимном классе.
Другими словами, переменная s
, хотя и не объявлена какfinal, не переназначается, и это делает его «фактически окончательным» (проверьте этот ответ для получения дополнительной информации).
До того, как Java 8 (и ваш другой проект - TestLogging
- имеет целевую версию 1.5), переменные должны были быть явно объявлены как окончательные