Generics 在Kotlin中使用单个泛型组合不同的参数类型

Generics 在Kotlin中使用单个泛型组合不同的参数类型,generics,kotlin,Generics,Kotlin,假设我们有以下变量: private val subscriptions1 = ArrayList<(String) -> Unit>() private val subscriptions2 = ArrayList<(Int) -> Unit>() private val subscriptions3 = ArrayList<(Char) -> Unit>() (KClass)->单元表示将KClass作为参数的函数类型。lambdas后

假设我们有以下变量:

private val subscriptions1 = ArrayList<(String) -> Unit>()
private val subscriptions2 = ArrayList<(Int) -> Unit>()
private val subscriptions3 = ArrayList<(Char) -> Unit>()
(KClass)->单元
表示将KClass作为参数的函数类型。lambdas后面有隐藏的功能接口。更好的选择是引入自己的接口,例如

interface Callback { 
  operator fun fun invoke(t: Any) : Unit  //operator for better syntax
}

val subscriptions = ConcurrentHashMap<KClass<*>, List<Callback>>()

fun <reified T> subscribe<T>(action: (T) -> Unit) {
  val wrapper = object: Callback {
     override operator fun invoke(t: Any) {
       action(t as T) ///inline function allows the cast
     }
  }
  subscriptions[T::class] = (subscriptions[T::class] ?: listOf<Callback>()) + wrapper
}
//works as-is
inline fun <reified T : Any> send(event: T) {
    val eventSubscriptions = getSubscriptionsOnEvent(T::class)
    for (eventProcessor in eventSubscriptions) {
        eventProcessor(event)  /// Callback.invoke function is called implicitly
    }
}
接口回调{
运算符fun invoke(t:Any):用于更好语法的单元//运算符
}
val订阅=ConcurrentHashMap()
趣味订阅(动作:(T)->单位){
val包装器=对象:回调{
重写运算符fun invoke(t:Any){
action(t as t)///内联函数允许强制转换
}
}
订阅[T::class]=(订阅[T::class]?:listOf())+包装器
}
//照原样工作
内联乐趣发送(事件:T){
val eventSubscriptions=getSubscriptionsOnEvent(T::class)
for(eventSubscriptions中的eventProcessor){
eventProcessor(event)///Callback.invoke函数被隐式调用
}
}

为了缩短示例,可以将
回调
接口替换为通用lambda函数
(任意)->单元
。实际上,在界面中包含其他内容可能是有意义的,因此,可能还是有意义的,这很有趣。我会用它作为解决方案。非常感谢。
inline fun <reified T : Any> send(event: T) {
    val eventSubscriptions = getSubscriptionsOnEvent(T::class)
    for (eventProcessor in eventSubscriptions) {
        eventProcessor(event)
    }
}
interface Callback { 
  operator fun fun invoke(t: Any) : Unit  //operator for better syntax
}

val subscriptions = ConcurrentHashMap<KClass<*>, List<Callback>>()

fun <reified T> subscribe<T>(action: (T) -> Unit) {
  val wrapper = object: Callback {
     override operator fun invoke(t: Any) {
       action(t as T) ///inline function allows the cast
     }
  }
  subscriptions[T::class] = (subscriptions[T::class] ?: listOf<Callback>()) + wrapper
}
//works as-is
inline fun <reified T : Any> send(event: T) {
    val eventSubscriptions = getSubscriptionsOnEvent(T::class)
    for (eventProcessor in eventSubscriptions) {
        eventProcessor(event)  /// Callback.invoke function is called implicitly
    }
}