Специально для последнего вопроса:
И почему эти 2 кода генерируют байт-код JVM разных типов
Поскольку в JVM нет гарантии, что JAR, содержащий Option
класс во время выполнения такой же, как и во время компиляции.Это хорошо, потому что в противном случае даже второстепенные версии библиотек (включая стандартные библиотеки Java и Scala) были бы несовместимы, и вам нужно было бы использовать все зависимости, чтобы использовать одну и ту же младшую версию их общих зависимостей.
Если этоВ классе нет подходящего метода flatMap
, вы получите AbstractMethodError
, но в противном случае семантика Scala требует вызова метода flatMap
.Таким образом, компилятор должен испускать байт-код для фактического вызова метода.
Kotlin обходит это, используя inline
функции , и Scala 3 будет поддерживать их тоже , ноЯ не знаю, будет ли он использовать их для таких случаев.