为何Lambda表达式`var a: ()->Int = {()->5};`报“Expected no parameters”错误?
Kotlin Lambda写法问题解析
为什么第一种写法错误?
你声明的变量a类型是**()->Int**,意思是一个无参数、返回Int类型的函数。
第一种写法:
var a: ()->Int = {()->5};
这里的{()->5}本质是一个Lambda,它的逻辑是「定义一个无参数的内部函数并返回」,所以这个Lambda的实际类型是**()->()->Int**(无参数,返回另一个无参数返回Int的函数),和你声明的()->Int类型完全不匹配,编译器自然会报错"Expected no parameters"——它提示你这个Lambda不需要参数,你却在里面嵌套了一个函数定义,而不是直接返回Int值。
第二种写法为什么正确?
var a: ()->Int = {5};
这个Lambda没有参数,直接把5作为返回值。Kotlin中,Lambda的最后一行表达式就是返回值,默认省略return关键字,完全符合()->Int的类型要求:无参数,返回Int。
关于你遇到的类似问题
你提到的「期望**()->Unit**却传入**(Any?)->Unit**」,是因为Kotlin编译器的类型推断有时候会出现偏差。比如当你写一个不带参数的Lambda时,如果上下文存在带参数的函数类型,编译器可能会错误推断成带参数的(默认推断成(Any?)->Unit)。这时候你可以显式用{}或者_ ->来明确表示这是一个无参数的Lambda,比如:
// 明确无参数的Lambda val callback: ()->Unit = {} // 用下划线表示不接收任何参数 val callback: ()->Unit = { _ -> }
内容的提问来源于stack exchange,提问作者Sanja
相关产品推荐
相关产品推荐

