小编And*_*ich的帖子

Kotlin SAM转换不适用于带有两个参数的函数

我正在学习Kotlin,并尝试将LiveData与它一起使用。由于LiveData库是用Java编写的,因此Kotlin应该支持SAM转换。

LiveData类具有observe带有两个参数的方法,Observer并且LifecycleOwner

void observe (LifecycleOwner owner, Observer<T> observer)
Run Code Online (Sandbox Code Playgroud)

两者都是单一方法的接口。当我对两个参数都使用SAM lambda时,它可以正常工作:

val liveData = MutableLiveData<Int>()
liveData.observe({ lifecycleOwner.lifecycle }, { invokeMyMethod(it) })
Run Code Online (Sandbox Code Playgroud)

当我为对象和SAM Lambda提供特定类型(Observer)时,它也可以使用:

val liveData = MutableLiveData<Int>()
liveData.observe(lifecycleOwner, Observer { invokeMyMethod(it) })
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将object用于一个参数,将SAM lambda不带类型用于另一个参数时:

val liveData = MutableLiveData<Int>()
liveData.observe(lifecycleOwner, { invokeMyMethod(it) })
Run Code Online (Sandbox Code Playgroud)

它给了我编译错误。但是为什么我不能写这样的代码?这正是我想要的,紧凑,没有样板代码。中只有一种observe方法LiveData,为什么我必须指定lambda的类型?

编译器会产生这样的错误:

类型不匹配。必需:观察员!>,找到:()?单元

小更新,我刚刚检查了这种组合,它也行不通:

val liveData = MutableLiveData<Int>()
liveData.observe({ lifecycleOwner.lifecycle }, Observer { invokeMyMethod(it) })
Run Code Online (Sandbox Code Playgroud)

因此,当两个参数都是SAM lambda时,它就可以工作,但是当一个参数是SAM lambda而另一个是具有指定类型的SAM lambda时,它就不起作用。在这种情况下,编译器也会给出相同的Type mismatch错误。

android kotlin android-livedata

5
推荐指数
1
解决办法
533
查看次数

标签 统计

android ×1

android-livedata ×1

kotlin ×1