我有两个名为
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
不会作用于传递给 run
的 lambda。它返回整个 letItPlay2
函数。
您打算改为编写
return@run Unit
,并且这会按预期进行编译。
return Unit
本身是Nothing
类型的表达式。因此,{ return Unit }
被认为是返回Nothing
的闭包。闭包中的最终表达式是该闭包将返回的内容。重申一下,return Unit
返回 letItPlay2
,而不是闭包,因此编译器将其视为仅仅是一个表达式。
这与
{ 5 }
是一个返回Int
的闭包,以及{ throw Exception() }
是一个返回Nothing
的闭包(throw
表达式也是Nothing
类型)的方式相同。
因此,
run
返回Nothing
,并且推断letItPlay2
返回Nothing
。作为一种设计选择,Kotlin 要求必须显式指定返回类型 Nothing
,因此这会给您带来 letItPlay2
处的错误。您返回的 Unit
与 Nothing
不兼容,这会给您带来 Unit
处的错误。