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
错误。
这是https://youtrack.jetbrains.com/issue/KT-14984。据此,它最终应该在 Kotlin 1.3 中得到修复,但所需的类型推断更改目前是选择加入的,并且需要显式启用:https ://discuss.kotlinlang.org/t/new-type-inference -in-kotlin-1-3-0-rc-190/9914/2
归档时间: |
|
查看次数: |
533 次 |
最近记录: |