显然,这被类型检查器拒绝:
val a: Unit = 42 // Fail
但是,这很好:
val b: Unit = { 42 }() // Pass
我可以理解:
val f: ()->Any = { -> 42 } // Pass
由于Int <: Any
. 但是,它必须是不同的Unit
(它不是 的超类型Int
)。是否有一些文档解释发生了什么?
官方文档在lambda 表达式语法下对此进行了介绍:
如果推断的 lambda 的返回类型不是 Unit,则 lambda 主体内的最后一个(或可能单个)表达式被视为返回值。
因此,基本上,如果您将 lambda 显式分配给返回的函数类型,Unit
或者您调用它并将其结果分配给Unit
,它将推断您不希望返回 lambda 内的最后一个表达式(否则默认情况下会发生) .
val b: Unit = { 42 }()
由于您明确指定了变量的类型b
,Unit
因此 lambda 实际上不会return 42
。另一方面,如果您让编译器推断函数类型或适当地指定它,则最后一个 lambda 语句将成为 resultInt
,在这种情况下是 type 。
以下两种情况都是可能的:
val b1: () -> Unit = { 42 }
val b2: () -> Int = { 42 }
除了这些(直接调用 lambda):
val a1: Unit = { 42 }()
val a2: Int = { 42 }()
文档可以在这里找到。
lambda 表达式总是被花括号包围,完整语法形式的参数声明位于花括号内并具有可选的类型注释,主体位于 -> 符号之后。如果推断的 lambda 的返回类型不是
Unit
,则 lambda 主体内的最后一个(或可能是单个)表达式被视为返回值。