Я заметил разницу в выводе типа Scala при применении к def
и val
.
Используя def
, я могу определить абстрактный нулевой метод const
, возвращающий некоторое значение типа Int => Int
. При реализации const
с литералом функции мне не нужно указывать тип параметра, поскольку он может быть выведен компилятором:
trait D {
def const: Int => Int
}
object D extends D {
def const = i => i + 1
}
Это нормально. (С другой стороны, создается новый экземпляр функции для каждого доступа к D.const
.)
Теперь рассмотрим аналогичную конструкцию с использованием val
:
trait V {
val const: Int => Int
}
object V extends V {
val const = i => i + 1
}
Это не будет компилироваться, не с помощью
error: missing parameter type
val const = i => i + 1
^
Почему?