没有else的scala if语句的返回类型是什么

ben*_*ndl 2 types scala

我在一些Scala代码中犯了类似下面的错误:

val someVal:String = if (someX == someY) n
Run Code Online (Sandbox Code Playgroud)

回想起来,错误对我来说很明显(它必须为someVal分配一些东西,如果表达式为false,它可能不会是一个字符串).我想知道如果表达式为false,返回的值是什么.我最好的猜测是单位,或者也许是AnyVal.

Tyl*_*ler 10

该代码不会编译,因为someVal要成为一个String,那么每个执行路径(ifelse)都必须返回一个String.但是,由于你没有else,这是不可能的,因此不会编译.

编译器错误将是以下内容,表示Unit您应该返回时返回String:

error: type mismatch;
 found   : Unit
 required: String
Run Code Online (Sandbox Code Playgroud)

那是因为你所拥有的相当于:

val someVal: String = if (foo == bar) "Hello World" else ()
Run Code Online (Sandbox Code Playgroud)

()Unit的唯一值,它不是String类型的有效值.

在将来,您可以使用Scala repl并让它告诉您类型(只是不指定一个):

scala> val someVal1 = if (true) "Hello World" 
someVal1: Any = Hello World

val someVal2 = if (false) "Hello World" 
someVal2: Any = ()
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,Any因为这是Unit和之间唯一的共同父类String:

类层次结构