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

And*_*ich 5 android kotlin android-livedata

我正在学习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错误。

Ale*_*nov 4

这是https://youtrack.jetbrains.com/issue/KT-14984。据此,它最终应该在 Kotlin 1.3 中得到修复,但所需的类型推断更改目前是选择加入的,并且需要显式启用:https ://discuss.kotlinlang.org/t/new-type-in​​ference -in-kotlin-1-3-0-rc-190/9914/2