Scala 3.8: три вещи, которые сломают ваш проект при апгрейде
Scala 3.8 вышла в январе 2026. Фич много, но сначала - про то, что может больно ударить при переезде.
1. JDK 17 - жёсткое требование
Никакого JDK 11, никакого JDK 8. Реализация lazy val переписана с sun.misc.Unsafe на VarHandles - потому что в JDK 26 Unsafe будет бросать исключения. Компилятор просто откажется работать на старой JVM.
Если ваша инфраструктура ещё на JDK 11 - апгрейд Scala придётся отложить до апгрейда JVM. Scala 3.3 LTS пока остаётся на JDK 8+.
2. stdlib скомпилирована Scala 3 - и один неочевидный момент
Бинарная совместимость сохранена, но явная передача ClassTag теперь требует using:
// ❌ Перестало компилироваться Array.empty(reflect.ClassTag.Int) // ✅ Array.empty(using reflect.ClassTag.Int) // или просто Array.empty[Int]
Хорошая новость: компилятор умеет чинить такие места автоматически. Запускаем на Scala 3.7.4 перед апгрейдом:
scalac -source:3.7-migration -rewrite YourFile.scala
3. betterFors меняет тип результата - молча
betterFors теперь включён по умолчанию. Новый дешугаринг убирает промежуточный map - это хорошо для производительности, но меняет поведение кода с Map и несколькими val-алиасами:
// Этот код даёт РАЗНЫЕ результаты в 3.7 и 3.8 val result: Iterable[(Int, Int)] = for (k, v) <- Map(1 -> 1, 2 -> 1, 3 -> 1) x = k + v (a, b) = f(x) (y, z) <- Map(42 -> 27) yield (a + y, b + z) // 3.7 → List((43,29), (43,30), (43,31)) // 3.8 → Map(43 -> 31)
В 3.7 синтетический map превращал Map в Iterable. В 3.8 этого шага нет - Map остаётся Map, дубли ключей исчезают. 3.8.2 выдаёт предупреждение на такие места. Не игнорируйте.
Фикс простой - явно приводить к Seq:
(k, v) <- Map(1 -> 1, 2 -> 1, 3 -> 1).toSeq
В своем канале в Telegram и в канале Max о разработке в стартапах рассказываю ещё больше интересного и делюсь опытом, заходите, найдете полезные кейсы!
И ещё одно: не берите 3.8.0 и 3.8.1
Сразу после релиза в 3.8.0 нашли JVM linkage errors при использовании Scala 2.13 библиотек. 3.8.1 закрыл это, но оставил баг в for-comprehension. Стабильная версия — 3.8.2 (вышла 24 февраля 2026).
Обновляться - только на неё.
