我正在学习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
答案 0 :(得分:24)
之所以会发生这种情况,是因为在第二种情况下,您尚未指定最终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
。
答案 1 :(得分:21)
如果没有明确的else
,Scala会假设:
else ()
其中()
是Unit
的值。例如,println
或var
的分配返回的值。
这很容易验证:
scala> val x = if (false) 1
x: AnyVal = ()
scala> x.isInstanceOf[Unit]
res3: Boolean = true