在泛型接口上调用方法
以下是我想要做的一个非常简单的例子:
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) }
- “转换”视图类来注释android
- 为什么Gradle构建的Kotlin源代码暂停〜3秒“强制System.gc()”?
- 当链接从Observable.create()创建的Observable时,RxJava用户onNext / onError / onComplete没有被调用
- 如何测试委托属性的生成器?
- 未解决的参考:T
- kotlin grpc.StreamObserver去rx.PublishSubject
- 为什么对象表达式中的代码可以访问kotlin中包含的变量?
- Kotlin Android中的Observable无法从()运算符调用
- 迭代:Kotlin是否有像Python一样的“枚举”function?