Syntax kotlin:忽略let函数的返回类型?
我可以用两种不同的返回类型创建相同的函数,并且无论选择哪个版本,都不会出现编译错误。这是一个bug还是某种语言特性Syntax kotlin:忽略let函数的返回类型?,syntax,kotlin,Syntax,Kotlin,我可以用两种不同的返回类型创建相同的函数,并且无论选择哪个版本,都不会出现编译错误。这是一个bug还是某种语言特性 fun unitOrInt(): Int { return 1.let { 1 }} fun unitOrInt(): Unit { return 1.let { 1 }} fun unitOrInt() { return 1.let { 1 }} 1.let{1}的类型是IntnotUnit。为什么允许使用Unit版本?该let函数是通用的,它是内联的funt T
fun unitOrInt(): Int { return 1.let { 1 }}
fun unitOrInt(): Unit { return 1.let { 1 }}
fun unitOrInt() { return 1.let { 1 }}
1.let{1}
的类型是Int
notUnit
。为什么允许使用Unit
版本?该let
函数是通用的,它是内联的funt T.let(block:(T)->R):R
。调用此函数时,编译器将从封闭上下文推断类型参数
在函数的第一个声明中,编译器知道调用的预期类型是Int
,因此它将R type参数推断为Int
,并找到匹配类型的值作为lambda的最后一个表达式。在第二个声明中,预期的类型是Unit
,因此编译器将R推断为Unit
,并忽略lambda的最后一个表达式。在第三个声明中,没有返回类型声明,因此编译器替换Unit
,并像第二个声明一样对其进行分析
为了更好地了解发生了什么,可以显式声明let
的类型参数:
fun unitOrInt1(): Int { return 1.let<Int, Int> { 1 }}
fun unitOrInt2(): Unit { return 1.let<Int, Unit> { 1 }}
fun unitOrInt1():Int{return 1.let{1}
fun unitOrInt2():单元{return 1.let{1}
函数是泛型的,它是内联的funt T.let(block:(T)->R):R
。调用此函数时,编译器将从封闭上下文推断类型参数
在函数的第一个声明中,编译器知道调用的预期类型是Int
,因此它将R type参数推断为Int
,并找到匹配类型的值作为lambda的最后一个表达式。在第二个声明中,预期的类型是Unit
,因此编译器将R推断为Unit
,并忽略lambda的最后一个表达式。在第三个声明中,没有返回类型声明,因此编译器替换Unit
,并像第二个声明一样对其进行分析
为了更好地了解发生了什么,可以显式声明let
的类型参数:
fun unitOrInt1(): Int { return 1.let<Int, Int> { 1 }}
fun unitOrInt2(): Unit { return 1.let<Int, Unit> { 1 }}
fun unitOrInt1():Int{return 1.let{1}
fun unitOrInt2():单元{return 1.let{1}