gpt4 book ai didi

android - Kotlin、泛型和可能没有参数的函数

转载 作者:行者123 更新时间:2023-11-29 19:09:14 24 4
gpt4 key购买 nike

我正在尝试围绕一个非常常见的模式通用化样板,而 Kotlin 使我非常接近。

我已经构建了一个用作监听器管理器的类,如下所示:

class GenericListenerSupport <EventArgumentType, ListenerFunction: (EventArgumentType) -> Unit> {
private val listeners = mutableListOf<ListenerFunction>()

fun addListener(listener: ListenerFunction) {
listeners.add(listener)
}

fun removeListener(listener: ListenerFunction) {
listeners.remove(listener)
}

fun fireListeners(argument: EventArgumentType) {
listeners.forEach { it.invoke(argument) }
}
}

它可以按如下方式使用:

class ExampleWithArgument {
private val listenerSupport = GenericListenerSupport<String, (String)->Unit>()

fun exampleAdd() {
listenerSupport.addListener({ value -> System.out.println("My string: "+value)})
}

fun exampleFire() {
listenerSupport.fireListeners("Hello")
}
}

到目前为止,还不错。但是,如果听者没有论点怎么办?或者进一步延伸,多个参数。

我可以勉强通过这个:

class ExampleWithNoArgument {
private val listenerSupport = GenericListenerSupport<Nothing?, (Nothing?)->Unit>()

fun exampleAdd() {
listenerSupport.addListener({ System.out.println("I've got no argument")})
}

fun exampleFiring() {
listenerSupport.fireListeners(null)
}
}

但是闻起来很臭,显然多参数也没用。

有没有更好的方法来实现这一点?例如支持这个概念的东西:

private val listenerSupport = GenericListenerSupport<???, (String, Double)->Unit>()

最佳答案

因为你的 GenericListenerSupport 声明了一个类型参数 EventArgumentType 并且期望它在 fun fireListeners(argument: EventArgumentType) 中有一个实例,我怀疑你可以以干净的方式支持多个参数。相反,我建议使用数据类(没有太多额外代码)作为包装多个值的干净且类型安全的方法:

data class MyEvent(val id: String, val value: Double)

private val listenerSupport = GenericListenerSupport<MyEvent, (MyEvent) -> Unit>()

至于不传值,也可以使用Unit,只有一个值的类型Unit:

listenerSupport.fireListeners(Unit)

类型系统和解析不允许您在需要单个参数的地方不传递任何参数,但是,作为 @Ruckus T-Boom建议,您可以在需要 Unit 的地方进行扩展以触发没有值的监听器:

fun GenericListenerSupport<Unit>.fireListeners() = fireListeners(Unit)

有点题外话,但我认为如果您不需要自定义函数类型并且 (EventArgumentType) -> Unit 就足够了,您可以简化类型:

class GenericListenerSupport<EventArgumentType> {
/* Just use `(EventArgumentType) -> Unit` inside. */
}

关于android - Kotlin、泛型和可能没有参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45987685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com