如何使用依赖返回类型覆盖方法?

时间:2012-08-30 10:57:15

标签: scala scala-2.9 path-dependent-type

我在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的后向移植修复?)

1 个答案:

答案 0 :(得分:3)

如果你真的被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 = ???
  }
}