android - Kotlin 中的接口(interface)作为函数

标签 android kotlin

我正在开发一个包含一些 View 的 android 库。自然,这些 View 可以发出事件。

我有一个名为(仅出于此问题的目的)Listener 的接口(interface)。如果我用 Java 编写库,事情会是这样的:

public interface Listener {
    void onEvent();
}
public class SomeView extends FrameLayout {
    // Some more functions and implementation details

    public void setListener(Listener l) { ... }
}

在 Kotlin Activity 中使用此 View 时,我可以像这样使用 setListener:

someViewInstance.setListener {
    // implementation
}

我想在 Kotlin 中编写我的库,但它也可能在 Java 代码中使用,所以我想像常规 View (如上)一样为监听器提供和接口(interface),但可以选择 Kotlin 代码使用函数实现:

interface Listener {
    fun onEvent()
}

当我尝试在我的 Kotlin 测试 Activity 中像上面一样使用 setListener 时,我收到一个编译错误,指出该函数需要类型 Listener 但得到了 () -> 单位.

有没有办法在 Kotlin 中启用这种实现而无需为此创建新函数?

我曾想过只有一个函数接收 () -> Unit 但在 Java 代码中看起来很奇怪(Function1 等)。

谢谢!

最佳答案

您可以按照建议定义您的界面,还可以添加一个扩展,允许使用更适合 Kotlin 代码的 lambda。

class SomeView {
    fun setListener(l: Listener) {}
}

fun SomeView.setListener(l: () -> Unit) = setListener(object : Listener {
    override fun onEvent() = l()
})

在 Java 中,您仍然可以传递 Listener 实现。

关于android - Kotlin 中的接口(interface)作为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55116769/

相关文章:

AndroidX 数据绑定(bind) API 不起作用

kotlin - 测试代码时为什么会出现错误 “Unresolved reference: launch”?

android - 从临时文件加载 Base 64 图像问题

java - Android RunOnUIThread 不会永久改变 View 可见性

一段时间后 Android Zoom 没有响应?

java - Android:Dagger 2 和构造函数注入(inject)

android - 构建 AOSP 自定义 ROM

android - Kotlin 对 null 的非 null 断言

android - 文件仅在重启 Android 设备后写入

spring-boot - Kotlin 和 Spring 启动, transient 属性未正确初始化