2

显然,这被类型检查器拒绝:

val a: Unit = 42 // Fail

但是,这很好:

val b: Unit = { 42 }() // Pass

我可以理解:

val f: ()->Any = { -> 42 } // Pass

由于Int <: Any. 但是,它必须是不同的Unit(它不是 的超类型Int)。是否有一些文档解释发生了什么?

4

2 回答 2

4

官方文档在lambda 表达式语法下对此进行了介绍:

如果推断的 lambda 的返回类型不是 Unit,则 lambda 主体内的最后一个(或可能单个)表达式被视为返回值。

因此,基本上,如果您将 lambda 显式分配给返回的函数类型,Unit或者您调用它并将其结果分配给Unit,它将推断您不希望返回 lambda 内的最后一个表达式(否则默认情况下会发生) .

于 2018-01-30T10:58:12.047 回答
4
val b: Unit = { 42 }() 

由于您明确指定了变量的类型bUnit因此 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 主体内的最后一个(或可能是单个)表达式被视为返回值。

于 2018-01-30T11:02:44.127 回答