return
или return expr
имеет тип Nothing
. Вы можете заменить это на любой тип, так как он никогда не возвращает значение окружающему выражению, вместо этого он возвращает управление вызывающей стороне.
В вашей программе он маскируется под требуемый тип () => Unit
.
Вот иногда удобное использование для этого (хотя вы можете быть запятнаны как однотипные, если вы используете его слишком часто, не говорите никому, что слышали это от меня!)
def foo(a: Option[Int]): Int = {
val aa: Int = a.getOrElse(return 0)
aa * 2
}
Для записи вы, вероятно, должны написать:
def foo(a: Option[Int]): Int =
a.map(_ * 2).getOrElse(0)
Вы можете получить представление о разуме компилятора, проверив вывод scala -Xprint:typer -e <one-liner>
. Добавьте -Ytyper-debug
, если вам нравится просеивать через множество выводов!
scala210 -Ytyper-debug -Xprint:typer -e 'def foo: Any = {val x: () => Any = { return }}'
... elided ...
typed return (): Nothing
adapted return (): Nothing to () => Any,