【发布时间】:2019-12-04 16:33:52
【问题描述】:
我有一个抽象类 (MessageHandlerAdapter),它接受一个泛型类型 (P),然后用于键入传递给它的函数之一的值:
abstract class MessageHandlerAdapter<in P : Any> {
abstract fun canHandle(): MessageType
abstract fun handle(payload: P)
}
如果我将它与List<MessageHandlerAdapter<*>> 一起使用,我会收到关于使用strategy.handle(message.payload) 的错误消息Out-projected type 'MessageHandlerAdapter<*>' prohibits the use of 'public abstract fun handle(payload: P): Unit defined in MessageHandlerAdapter':
class MessageHandlerStrategy(
private val messageHandlers: List<MessageHandlerAdapter<*>>
) {
private val strategies = messageHandlers.map { Pair(it.canHandle(), it) }.toMap()
fun handle(message: Message<Any>) {
val strategy = strategies[message.type]
?: throw IllegalArgumentException>(IllegalArgumentException("No MessageHandler for message of type ${message.type}"))
strategy.handle(message.payload)
}
}
但是,如果我将它与 List<MessageHandlerAdapter<Any>> 一起使用,我会在我尝试传入的列表中收到错误消息 Type inference failed. Expected type mismatch: required: List<MessageHandlerAdapter<Any>>found: List<MessageHandlerAdapter<*>>:
lateinit var stringHandler: MessageHandlerAdapter<String>
lateinit var intHandler: MessageHandlerAdapter<Int>
val messageHandlerStrategy = MessageHandlerStrategy(listOf(stringHandler, intHandler))
class MessageHandlerStrategy(
private val messageHandlers: List<MessageHandlerAdapter<Any>>
) {
private val strategies = messageHandlers.map { Pair(it.canHandle(), it) }.toMap()
fun handle(message: Message<Any>) {
val strategy = strategies[message.type]
?: throw IllegalArgumentException>(IllegalArgumentException("No MessageHandler for message of type ${message.type}"))
strategy.handle(message.payload)
}
}
我也尝试将MessageHandlerAdapter 的签名更改为abstract class MessageHandlerAdapter<P : Any> {...,但没有任何区别。
【问题讨论】: