我调用了两个函数letItPlay
,letItPlay2
它们之间唯一的区别是letItPlay2
的返回类型不存在,因此编译器会给出错误。我假设默认返回类型是 ,Unit
而letItPlay
的返回类型也是 ,Unit
因此我也假设两个函数的返回类型相同。但编译器会给出错误。为什么?
fun letItPlay(where: String = "Home",
whn: Long,
how: Float = 3.4f,
what: Any,
time: Int = 1,
quality: Double): Unit = run {
return Unit
}
fun letItPlay2(where: String = "Home", // Error: Return type 'Nothing' needs to be specified explicitly.
whn: Long,
how: Float = 3.4f,
what: Any,
time: Int = 1,
quality: Double) = run {
return Unit // Error: Return type mismatch: expected 'kotlin. Nothing', actual 'kotlin. Unit'.
}
注意:我知道这两个函数由于内联函数而很奇怪,但是好吧,那么为什么两者都会出错而只有一个会出错呢?
run { return Unit }
没有意义。在这种情况下,return Unit
不会对传递给 的 lambda 起作用run
。它返回的是整个letItPlay2
函数。您本来打算这样写
return@run Unit
,但编译结果却符合预期。return Unit
本身是 类型的表达式Nothing
。因此,{ return Unit }
被认为是返回 的闭包Nothing
。闭包中的最终表达式是该闭包将返回的内容。重申一下,return Unit
返回letItPlay2
,而不是闭包,因此编译器将其视为仅仅是一个表达式。{ 5 }
这与闭包返回Int
和{ throw Exception() }
返回 的闭包 是一样的Nothing
(throw
表达式也是 类型Nothing
)。因此,
run
返回Nothing
并且letItPlay2
推断为返回。作为设计选择,Kotlin 要求必须明确指定Nothing
返回类型,因此这会在 处导致错误。您返回的与 不兼容,这会在 处导致错误。Nothing
letItPlay2
Unit
Nothing
Unit