Kotlin – 高阶函数和类型不匹配
我刚开始学习kotlin,并正在努力了解高阶函数如何确定类型,我经常看到这种错误
错误:类型不匹配:推断的类型是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
,这意味着它有两个参数。 这是因为这个表达式引用类的方法而不是引用当前实例的方法。 这意味着当你调用它的时候,你必须传入一个MyClass
实例来调用它,以及String
参数。 这使得它(MyClass, String) -> Unit
功能,导致类型不匹配。
例如,你可以这样称呼它:
class MyClass { fun test() { val s = MyClass::save s(this, "some value") } fun save(value: String) { // ... } }
至于你在找什么,Kotlin 1.1引入了绑定可调用的引用 ,你可以用它来引用一个类的特定实例的功能:
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)) }
- Firebase:在Kotlin / Java中使用枚举字段的干净方式?
- Kotlin:如何在类中使用多个Generic?
- 房间Kotlin:实体和Pojos必须有一个可用的公共构造函数
- 执行任务失败':app:compileDebugKotlin'
- 图像视图不会出现在Activity上(在AppCompatActivity上可以)
- Android Studio / Kotlin – 无效错误“覆盖方法应该调用超级”
- NotificationManager.setInterruptionFilter不适用于某些电话
- Android Kotlin类实现的问题
- Android Kotlin匕首2 ViewModel注入错误