我的接口(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/