Scala 返回If表达式中的类型
我正在学习scala,不明白为什么: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
def signum(arg: Int) = {
if(arg > 0 ) 1
else if(arg < 0) -1
else 0
}
Has
AnyVal
符号(arg:Int):AnyVal
发生这种情况是因为在第二种情况下,您没有指定finalelse
部分。在这种情况下,此缺失分支的返回类型将为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