在If表达式中返回类型

时间:2012-02-07 12:25:02

标签: scala

我正在学习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

2 个答案:

答案 0 :(得分:24)

之所以会发生这种情况,是因为在第二种情况下,您尚未指定最终else部分。在这种情况下,此缺失分支的返回类型为Unit。因此,Scala编译器将AnyVal推断为IntUnit的共同父级。

您可以尝试将明确的返回类型添加到函数签名中:

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的值。例如,printlnvar的分配返回的值。

这很容易验证:

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

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