在泛型接口上调用方法

以下是我想要做的一个非常简单的例子:

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())给我一个编译器错误

超出投影类型'EventConsumer <*>?' 禁止使用“公共抽象趣味消费(事件:T):在EventConsumer中定义的单位'

我知道Kotlin对Java的泛型比Java更严格,这可能是为什么它不起作用,但是我将如何正确实现这样的东西呢?

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

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