gpt4 book ai didi

kotlin - 使用泛型调用接口(interface)上的方法

转载 作者:行者123 更新时间:2023-12-01 23:01:16 25 4
gpt4 key购买 nike

以下是我正在尝试做的事情的一个非常简单的说明:

interface Event {
fun value(): Int
}

class Event1: Event {
override fun value() = 1
}

class Event2: Event {
override fun value() = 2
}

interface EventConsumer<T> where T: Event {
fun consume(event: T)
}

class Event1Consumer: EventConsumer<Event1> {
override fun consume(event: Event1) {
println(event.value())
}
}

class Event2Consumer: EventConsumer<Event2> {
override fun consume(event: Event2) {
println(event.value())
}
}

class EventManager {
private val consumers: Map<KClass<*>, EventConsumer<*>> = mapOf(
Event1::class to Event1Consumer(),
Event2::class to Event2Consumer()
)

fun consume(event: Event) {
val consumer = consumers[event::class]

consumer?.consume(event)
}
}

最后的方法调用 (consumer.consume()) 给我一个编译器错误

Out-projected type 'EventConsumer<*>?' prohibits the use of 'public abstract fun consume(event: T): Unit defined in EventConsumer'

我知道 Kotlin 对泛型比 Java 严格得多,这可能就是它不起作用的原因,但我该如何正确实现这样的东西?

最佳答案

由于您正在构建 consumers 映射,因此将未经检查的类型转换为正确的通用 EventConsumer 类型是安全的:

fun <T: Event> consume(event: T) {
val consumer = consumers[event::class] as? EventConsumer<T>

consumer?.consume(event)
}

关于kotlin - 使用泛型调用接口(interface)上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45332853/

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