Kotlin中Any::hashCode函数引用类型不匹配问题解析
Kotlin成员函数引用的隐式参数解析
先看代码示例:
fun myHashcode() : Int{ return 1 } val functionRef1: () -> Int = Any::hashCode // 编译报错:类型不匹配 val functionRef2: () -> Int = ::myHashcode // 正常编译
报错信息明确显示:Type mismatch. Required: () → Int Found: KFunction1<Any, Int>,按照提示把functionRef1的类型改成(Any) -> Int就能正常编译。
这个额外的Any参数,本质是成员函数自带的隐式this参数。
在Kotlin里,所有非静态的成员函数,底层都会默认接收一个指向当前类实例的引用——就是我们在函数里用的this。当你用类名::成员函数的方式获取函数引用时,这个原本隐藏的this会被转成函数的第一个显式参数。
拿Any的hashCode来说,它的定义看起来是无参的:
fun hashCode(): Int
但在JVM层面,它实际等价于带一个实例参数的函数:
fun hashCode(this: Any): Int
所以Any::hashCode的函数引用类型就是(Any) -> Int——第一个参数用来传入要调用hashCode的Any实例,调用时就相当于实例.hashCode()。
而像::myHashcode这种顶层函数(不属于任何类的函数),没有所属的实例,所以不需要额外参数,类型就和它的定义一致,是() -> Int。
内容的提问来源于stack exchange,提问作者oleh_kv
相关产品推荐
相关产品推荐

