【发布时间】:2021-07-15 00:11:17
【问题描述】:
我坚持一些简单的事情)假设我有以下内容:
interface IMessagePayload // marker interface
data class IdPayload(
val id: Long
) : IMessagePayload
data class StringPayload(
val id: String,
) : IMessagePayload
那我有课了:
data class Message<T : IMessagePayload>(
val id: String,
val payload: T,
)
我还有一些描述此消息处理器的接口:
interface IMessageProcessor<T : IMessagePayload> {
fun process(message: Message<T>)
}
还有一些实现:
class ProcessorImpl : IMessageProcessor<IdPayload> {
override fun process(message: Message<IdPayload>) {
}
}
现在我想要一张此类处理器的地图。让我们使用一些枚举类型作为这个映射的键:
enum class ActionType {
UPDATE,
DELETE,
ADD
}
private var map = mutableMapOf<ActionType, IMessageProcessor<IMessagePayload>>()
map[ActionType.ADD] = ProcessorImpl() // <-- error here
这就是问题所在。我无法将 ProcessorImpl 放入此地图。编译器说有一个错误:类型不匹配。必需:IMessageProcessor。找到:ProcessorImpl()。
我可以通过以下方式声明地图(使用星形投影):
private var map = mutableMapOf<ActionType, IMessageProcessor<*>>()
但在这种情况下,我不能调用处理器的 process 方法,首先按键从地图中获取它:
map[ActionType.ADD]?.process(Message("message-id", IdPayload(1))) // <-- error here
编译器抱怨:类型不匹配。什么都不需要。找到Message<IdPayload>
我做错了什么?任何帮助表示赞赏。
【问题讨论】: