android - 如何声明与 lambda 一起使用的接口(interface)?

标签 android lambda interface kotlin

<分区>

我这样声明了一个简单的接口(interface):

   interface OnSomethingReadyListener {
        fun onSomethingReady()
    }

当然还有二传手:

private val onSomethingReadyListeners = ArrayList<OnSomethingReadyListener>()

fun addOnSomethingReadyListener(callback: OnSomethingReadyListener) {
    onSomethingReadyListeners.add(callback)
}

但是后来我发现我不能使用lambda:

something.addOnShopDataReadyListener { progressbar.visibility = View.GONE }

IDE 给我一个错误:

Type mismatch.
Required: SomeClass.OnSomethingReadyListener
Found:    () -> Unit

假设我想坚持使用 lambda 而不是匿名类 (object : OnSomethingReadyListener {...})。我应该如何声明 OnSomethingReadyListener

最佳答案

SAM(单一抽象方法)转换只支持Java接口(interface),不支持Kotlin接口(interface)。

The documentation陈述这个推理:

Also note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.

KT-7770 requests this functionality , 如果您想跟踪是否正在考虑它。

实现您想要的效果的推荐方法是将 OnSomethingReadyListener 替换为类型为 () -> Unit 的参数,如下所示:

private val onSomethingReadyListeners = ArrayList<() -> Unit>()

fun addOnSomethingReadyListener(callback: () -> Unit) {
    onSomethingReadyListeners.add(callback)
}

然后你可以用类似的东西调用那些监听器

onSomethingReadyListeners.forEach { it.invoke() }

关于android - 如何声明与 lambda 一起使用的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470837/

相关文章:

java - Android 中 Bitmap 的 getPixels 方法说明

java - 参数数量不定的 Lambda 函数

node.js - 使用 Vandium : Expected event type of apigateway but identified as unknown 时无服务器调用测试返回状态 500

c# - 如何将泛型 List<T> 转换为基于接口(interface)的 List<T>

Android:将 View 放置在任意位置

android - 在使用 CursorAdapter 的情况下如何更新 ListView?

php - 如何将 Android 上的 SQLite 同步到 MySQL

c++ - 为什么带有指向成员函数指针的可变 lambda?

c# - 将抽象转换为由 Derived 实现的接口(interface)

C# - 无法将类型 List<Product> 隐式转换为 List<IProduct>