android – Kotlin SAM转换不适用于带有两个参数的函数
作者:互联网
我正在学习Kotlin并尝试使用LiveData.由于LiveData库是用Java编写的,因此Kotlin应该支持SAM转换.
LiveData
类的方法observe
有两个参数,Observer
和LifecycleOwner
:
void observe (LifecycleOwner owner, Observer<T> observer)
两者都是单一方法的接口.当我使用SAM lambdas作为两个参数时它工作正常:
val liveData = MutableLiveData<Int>()
liveData.observe({ lifecycleOwner.lifecycle }, { invokeMyMethod(it) })
当我提供具有特定类型的对象和SAM lambda(Observer)时,它也可以工作:
val liveData = MutableLiveData<Int>()
liveData.observe(lifecycleOwner, Observer { invokeMyMethod(it) })
但是,当我尝试将对象用于一个参数而SAM lambda没有用于另一个参数时:
val liveData = MutableLiveData<Int>()
liveData.observe(lifecycleOwner, { invokeMyMethod(it) })
它给了我编译错误.但为什么我不能写这样的代码?这正是我想要的,紧凑的,没有样板代码. LiveData中只有一种观察方法,为什么我必须指定lambda的类型?
编译器产生这样的错误:
Type mismatch. Required: Observer!>, Found: () → Unit
小更新,我刚检查了这个组合,它也不起作用:
val liveData = MutableLiveData<Int>()
liveData.observe({ lifecycleOwner.lifecycle }, Observer { invokeMyMethod(it) })
因此,当两个参数都是SAM lambdas时它可以工作,但是当一个是SAM lambda而另一个是具有指定类型的SAM lambda时不起作用.在这种情况下,编译器也会提供相同的类型不匹配错误.
解决方法:
这是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
标签:android,kotlin,android-livedata 来源: https://codeday.me/bug/20190627/1303226.html