Ошибка несоответствия типов в Scala - PullRequest
1 голос
/ 23 января 2012

У меня есть сценарий, который вызывает несоответствие типов, которое я не могу решить. Вот упрощенная версия кода:

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)
}

1 Ответ

4 голосов
/ 23 января 2012

Я могу заставить его скомпилироваться в Scala 2.9 с двумя изменениями,

trait Channel[M <: Msg] {
  type M2 = M       // Introduce a type member that's externally visible
  def receive(): M2
  def ack(envelope: M2)
}

object ChannelSender {
  private var channel : Channel[_ <: Msg] = _
  def assignChannel(channel : Channel[_ <: Msg]) = this.channel = channel

  def test() {
    val c = channel  // An immutable value, so that c.M2 is stable
    val msg = c.receive()
    c.ack(msg)       // OK now
  }
}

Первое изменение - использовать неизменное значение val c = channel, так что зависимый от пути тип c.M2 всегда означаетто же самое.Второе изменение - ввести элемент типа type M2 = M с чертой Channel.Я не совсем уверен, почему это необходимо (это может быть ошибка?).Следует отметить, что c.M2 является допустимым типом, тогда как c.M не определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...