generics - 带有泛型的 SAM 转换

标签 generics kotlin interface

我的接口(interface)定义如下:

interface OnItemClickDelegate<T: Entity> {
    fun onItemClick(entity: T?)
}

现在我在不同的类中匿名定义了接口(interface):

var itemClickDelegate = object : OnItemClickDelegate<Derived> {
        override fun onItemClick(entity: Derived?) {
            doSomethingWith(entity)
        }
    }

这编译得很好,但是当我将其切换为:

var itemClickDelegate = OnItemClickDelegate<Derived> { entity -> doSomethingWith(entity) }

我收到编译器错误:

Interface OnItemClickDelegate does not have constructors

如何用简短的符号书写我的声明?

最佳答案

遗憾的是,Kotlin 并不支持这种开箱即用的 kotlin 接口(interface)语法,仅支持 java 语法(无论您是否使用泛型)。

你可以做的是:


interface OnItemClickDelegate<T : Entity> {
    fun onItemClick(entity: T?)

    companion object {
        inline operator fun <T : Entity> invoke(crossinline op: (entity: T?) -> Unit) =
            object : OnItemClickDelegate<T> {
                override fun onItemClick(entity: T?) = op(entity)
            }
    }
}

这样你就可以像这样实例化一个监听器:

  val delegate = OnItemClickDelegate<Entity> {
                    //todo -> insert your callback code here
            }

关于generics - 带有泛型的 SAM 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57065603/

相关文章:

java - 可以通过 Java 泛型类型系统强制执行自然排序吗?

kotlin - Kotlin 协程如何在内部工作?

Kotlin - 没有 body 的类有什么用?

arrays - 系统Verilog : How to create an interface which is an array of a simpler interfaces?

c# - 如何使用子泛型接口(interface)实现泛型接口(interface)

c# - 在 ASP.NET Core 依赖注入(inject)中使用非泛型实现注册泛型接口(interface)

java - 创建结合两个但由一个统治的可观察对象

java - 抽象类的简单Q迭代器<Object E>

c++ - 我如何声明指向共享公共(public)接口(interface)的不同类的指针?

c# 按实体类型获取存储库