Тип возврата в выражении If
Я изучаю scala и не могу понять, почему:
def signum(arg: Int) = {
if(arg > 0 ) 1
else if(arg < 0) -1
else 0
}
Имеет Int
как возвращаемый тип signum (arg: Int): Int
Но
def signum(arg: Int) = {
if(arg > 0 ) 1
else if(arg < 0) -1
else if(arg == 0) 0
}
Имеет AnyVal
signum (arg: Int): AnyVal
Ответы
Ответ 1
В отсутствие явного else
, Scala предполагает следующее:
else ()
Где ()
- значение Unit
. Это значение, возвращаемое println
или присваиванием var
, например.
Это легко проверить:
scala> val x = if (false) 1
x: AnyVal = ()
scala> x.isInstanceOf[Unit]
res3: Boolean = true
Ответ 2
Это происходит потому, что во втором случае вы не указали окончательную часть else
. В этом случае тип возврата этой пропавшей ветки будет Unit
. Поэтому Scala компилятор выводит AnyVal
как общий родительский элемент Int
и Unit
.
вы можете попытаться добавить явный тип возвращаемого значения в подпись функции:
def signum(arg: Int): Int = ...
Он не будет компилироваться со следующей ошибкой:
found : Unit
required: Int
else if(arg == 0) 0
^
one error found
Итак, компилятор сообщает вам, что тип результата последнего if
на самом деле Unit
, а не Int
.