Разница между инициализацией подчеркивания var и val

Почему val x: Int = _ не компилируется, но var x: Int = _ делает?

Я получаю error: unbound placeholder parameter.

Ответ 1

В этом контексте _ означает "Я инициализирую это позже, просто заполните то, что разумное значение по умолчанию в это время". Поскольку вы не можете переназначить val, это не имеет смысла.

Для той же функциональности - для получения разумного значения по умолчанию - для val, вы можете использовать

val x: Int = null.asInstanceOf[Int]

Ответ 2

Вы не можете переназначить значение vals, поэтому вы не можете использовать _ (init со значением по умолчанию для предписанного типа) с ним. Но вы можете переназначить значение vars, поэтому логично инициализировать его с некоторым значением по умолчанию, например, в Java