Как я могу переопределить метод с зависимым типом возвращаемого значения?

У меня возникли проблемы с реализацией в Scala 2.9.2 метода, который объявляет зависимый возвращаемый тип. Следующий код

object DependentTypesQuestion {
  def ??? = throw new UnsupportedOperationException
  trait X {
    trait Y
  }
  trait Z {
    def z(x: X): x.Y
  }
  object Z extends Z {
    override def z(x: X): x.Y = ???
  }
}

под 2.9.2 выдает следующее сообщение об ошибке во время компиляции:

overriding method z in trait Z of type (x: DependentTypesQuestion.X)x.Y;  method z has incompatible type

В 2.10.0-M4 проблема вроде исправлена, но к сожалению мой проект пока привязан к 2.9.

Можно ли обойти эту проблему в версии 2.9.2?

(В качестве альтернативы, есть ли какие-либо перспективы для версии 2.9.3, которая будет включать исправление, перенесенное из версии 2.10?)


person Scott Morrison    schedule 30.08.2012    source источник


Ответы (1)


Если вы действительно застряли на 2.9.x, вам может подойти следующий обходной путь:

object DependentTypesQuestion {
  def ??? = throw new UnsupportedOperationException
  trait X {
    trait Y
  }
  trait Z[D[_ <: X with Singleton]] {
    def z[T <: X with Singleton](x: T): D[T]
  }

  type Dep[T <: X with Singleton] = T#Y

  object Z extends Z[Dep] {
    override def z[T <: X with Singleton](x: T): x.Y = ???
  }
}
person Miles Sabin    schedule 30.08.2012
comment
Понимаю. К сожалению, в моем реальном случае объект Z был внутренней реализацией, а внешние потребители видят только черту Z, поэтому это не обеспечивает типизацию, которая мне действительно нужна. - person Scott Morrison; 30.08.2012
comment
Думаю, пришло время попытаться сбежать из 2.9. - person Scott Morrison; 30.08.2012