其他分享
首页 > 其他分享> > android – Kotlin SAM转换不适用于带有两个参数的函数

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

作者:互联网

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

LiveData类的方法observe有两个参数,ObserverLifecycleOwner

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