Scala 返回If表达式中的类型

Scala 返回If表达式中的类型,scala,Scala,我正在学习scala,不明白为什么: def signum(arg: Int) = { if(arg > 0 ) 1 else if(arg < 0) -1 else 0 } HasAnyVal符号(arg:Int):AnyVal发生这种情况是因为在第二种情况下,您没有指定finalelse部分。在这种情况下,此缺失分支的返回类型将为Unit。因此Scala编译器推断出AnyVal是Int和Unit的公共父级 您可以尝试向函数签名添加显式返回类型: def

我正在学习scala,不明白为什么:

def signum(arg: Int) = {
    if(arg > 0 ) 1
    else if(arg < 0) -1
    else 0
}

Has
AnyVal
符号(arg:Int):AnyVal

发生这种情况是因为在第二种情况下,您没有指定final
else
部分。在这种情况下,此缺失分支的返回类型将为
Unit
。因此Scala编译器推断出
AnyVal
Int
Unit
的公共父级

您可以尝试向函数签名添加显式返回类型:

def signum(arg: Int): Int = ...
它将不会编译,并出现以下错误:

 found   : Unit
 required: Int
    else if(arg == 0) 0
         ^
one error found

因此,编译器告诉您最后一个
的结果类型,如果
实际上是
单位
,而不是
Int
,,在没有显式的
else
的情况下,Scala假设:

else ()
其中
()
单位的值。例如,它是由
println
或赋值给
var
返回的值

这很容易验证:

scala> val x = if (false) 1
x: AnyVal = ()

scala> x.isInstanceOf[Unit]
res3: Boolean = true

向所有公共成员添加类型注释是一个非常好的主意。首先,它可以防止这样的错误。第二,它是一种文档。第三,有时您希望返回某个(常规)类型,但编译器会推断出最具体的类型,例如,您希望使用Seq而不是List。(无可否认,全文搜索:
scala> val x = if (false) 1
x: AnyVal = ()

scala> x.isInstanceOf[Unit]
res3: Boolean = true