【问题标题】:Invoking methods on interfaces with generics使用泛型调用接口上的方法
【发布时间】:2017-07-27 00:51:17
【问题描述】:

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

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?'禁止使用“公共 abstract fun consume(event: T): Unit defined in EventConsumer'

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    由于您正在构建 consumers 映射,因此可以安全地对正确的通用 EventConsumer 类型进行未经检查的强制转换:

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

    【讨论】:

    • Aaaah 所以我一直缺少一个通用方法......这似乎解决了它,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2014-12-15
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多