У меня есть сценарий, который вызывает несоответствие типов, которое я не могу решить. Вот упрощенная версия кода:
abstract class Msg
trait Channel[M <: Msg] {
def receive(): M
def ack(envelope: M)
}
object ChannelSender {
private var channel : Channel[_ <: Msg] = _
def assignChannel(channel : Channel[_ <: Msg]) = this.channel = channel
def test() {
val msg = channel.receive()
channel.ack(msg) // Type mismatch here
}
}
Ошибка от компилятора:
несоответствие типов; найдено: msg.type (с базовым типом
com.msgtest.Envelope) требуется: _ $ 1, где введите _ $ 1 <:
com.msgtest.Envelope </p>
Какие изменения я могу сделать, чтобы это работало? Кроме того, изменения требуют компиляции следующей конкретной реализации:
class SomeMsg extends Msg
object SomeChannel extends Channel[SomeMsg] {
def receive(): SomeMsg = { null.asInstanceOf[SomeMsg] }
def ack(envelope: SomeMsg) {}
}
object Setup {
ChannelSender.assignChannel(SomeChannel)
}