为什么这个函数会导致编译时错误而其他则不会? [仅删除函数返回部分]

问题描述 投票:0回答:1

我有两个名为

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'.
}

注意:我知道由于内联函数,这两个函数都很奇怪,但是好吧,那为什么两个函数都给出错误而只有一个函数给出错误?

kotlin compiler-errors
1个回答
0
投票

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
处的错误。

© www.soinside.com 2019 - 2024. All rights reserved.