我可以使用2种不同的返回类型创建相同的函数,无论我选择哪个版本,都不会出现编译错误.它是一个bug还是一些语言功能?
fun unitOrInt(): Int { return 1.let { 1 }}
fun unitOrInt(): Unit { return 1.let { 1 }}
fun unitOrInt() { return 1.let { 1 }}
Run Code Online (Sandbox Code Playgroud)
的类型1.let{1}是Int不Unit.为什么Unit允许版本?
该let函数是通用的,其签名是inline fun <T, R> T.let(block: (T) -> R): R.调用此函数时,编译器会从封闭上下文中推断出类型参数.
在函数的第一个声明中,编译器知道调用的预期类型Int,因此它将R类型参数推断为Int,并且找到匹配类型的值作为lambda的最后一个表达式.在第二个声明中,期望的类型是Unit,因此编译器推断R as Unit并忽略lambda的最后一个表达式.在第三个声明中,没有返回类型声明,因此编译器Unit会像第二个声明一样替换和分析它.
为了更好地了解发生了什么,您可以let明确声明类型参数:
fun unitOrInt1(): Int { return 1.let<Int, Int> { 1 }}
fun unitOrInt2(): Unit { return 1.let<Int, Unit> { 1 }}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |