ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-06-27 09:11:02  阅读:389  来源: 互联网

标签:android kotlin android-livedata


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有