Kotlin – 高阶函数和types不匹配
我刚开始学习kotlin,并正在努力理解高阶函数如何确定types,我经常看到这种错误
错误:types不匹配:推断的types是KFunction2但(字符串) – >单位是预期的
上述错误是由以下原因造成的
class MyClass(private val valueChangeListener: MyValueChangeListener, public val storage: MyStorage): MySuperClass { fun saveValue(potentialValue: String) { super.processValue(potentialValue, MyClass::save) } fun save(value: String){ storage.storeValue(value) valueChangeListener.onValueChanged(value) } }
但是,如果我使用Lambda全部解决
class MyClass(private val valueChangeListener: MyValueChangeListener, public val storage: MyStorage): MySuperClass { fun saveValue(potentialValue: String) { super.processValue(potentialValue, super.processValue(potentialValue, { value: String -> save(value) }) } fun save(value: String){ storage.storeValue(value) valueChangeListener.onValueChanged(value) } }
MySuperClass
open class MySuperClass { private fun cleanseValue(value: String) : String { return value.toUpperCase().replace(" ", "").replace("-", "") } protected fun processValue(potentialValue: String, saveFunction: (String) -> Unit){ saveFunction(cleanseValue(potentialValue)) } }
MyClass::save
是一个KFunction2
,这意味着它有两个参数。 这是因为这个expression式引用类的方法而不是引用当前实例的方法。 这意味着当你调用它的时候,你必须传入一个MyClass
实例来调用它,以及String
参数。 这使得它(MyClass, String) -> Unit
function,导致types不匹配。
例如,你可以这样称呼它:
class MyClass { fun test() { val s = MyClass::save s(this, "some value") } fun save(value: String) { // ... } }
至于你在找什么,Kotlin 1.1引入了绑定可调用的引用 ,你可以用它来引用一个类的特定实例的function:
class MyClass(private val valueChangeListener: MyValueChangeListener, public val storage: MyStorage): MySuperClass() { fun saveValue(potentialValue: String) { super.processValue(potentialValue, this::save) // see here } fun save(value: String){ storage.storeValue(value) valueChangeListener.onValueChanged(value) } }
在Kotlin 1.1中,可以使用成员参考来解决这个问题:
fun saveValue(potentialValue: String) { super.processValue(potentialValue, this::save) }
如果您使用Kotlin 1.0.X,请使用lambda:
fun saveValue(potentialValue: String) { super.processValue(potentialValue, (arg) -> save(arg)) }
- 什么在我的gradle文件仍然保证警告:“配置’编译’已经过时,并已被取代’实施’”?
- 项目不会与Kotlin 1.1.3一起构建
- Android Kotlin Dagger2提供了gson:指定为非null的参数为null
- Gradle错误升级到Android Studio 3.0 Beta 1
- 从Fragment调用Anko toast()方法会导致java.lang.NoSuchMethodError
- 如何在Kotlin中使用Retrofit和Observable创建异步调用?
- 我们如何快速返回Kotlin函数中的多个值?
- 使用kotlin编译android项目时出错
- 反序列化kotlin数据类android