当前位置: 首页 > 知识库问答 >
问题:

在具有泛型的接口上调用方法

高迪
2023-03-14

下面是我试图做的一个非常简单的说明:

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

Out projected type’EventConsumer

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

共有1个答案

秦景同
2023-03-14

由于您正在构建消费者映射,因此可以安全地将未经检查的强制转换为正确的泛型Event消费者类型:

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

    consumer?.consume(event)
}
 类似资料:
  • 问题内容: 好的,这是我的问题: 我有一个包含interfaces的列表-和扩展该接口的接口的列表:。我要设置。我不希望使用任何东西或会花费更多内存的东西,因为我正在做的事情已经非常耗费成本。我确实需要能够说。我已经尝试过,但是后来我无法将接口添加到列表中,只能将SubInterfaces 添加到列表中。有什么建议? 我希望能够做这样的事情: RecordKeeper类是包含接口列表的类(NOT

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 我正在尝试返回一个对象,它应该是IClass的一个实现,具有一个通用类型,是IType的一个实现。 我要返回的实际类扩展了Class (abstract ),其泛型类型为ActualType: 抽象类对象实现了IClass接口,可以有任何扩展IType的类型 ActualType只是实现了IType接口 我在编译时得到一个“类型不匹配:无法从ActualClass转换为IClass”错误。我不明白

  • 我一直在尝试泛型,很快我就遇到了一些我无法解释的事情 例如: 我不明白

  • 问题内容: 我想在嵌套的静态接口中使用泛型类。我的目标是做这样的事情: 但是我得到一个错误:无法对非静态类型T进行静态引用。如果进行一些更改(如下所述),我可以在接口内部使用泛型,但是我想避免使用此方法,因为编写同一个类两次:一次用于MyClass,一次用于MyInterface。 谢谢。 编辑 :我想这样做: 要么 问题答案: 静态嵌套类或嵌套接口(顺便说一句,始终是静态的)与其外部类(或接口)

  • 为什么叫“泛型模型”,请查看一些基本概念 Keras的泛型模型为Model,即广义的拥有输入和输出的模型,我们使用Model来初始化一个泛型模型 from keras.models import Model from keras.layers import Input, Dense a = Input(shape=(32,)) b = Dense(32)(a) model = Model(inp