我以下列方式使用路径依赖类型:
trait Schema {
type Repr
}
trait Mapping[A] {
val schema: Schema
def reify(repr: schema.Repr): A
def reflect(value: A): schema.Repr
}
object Mapping {
implicit def trivialMapping(s: Schema): Mapping[s.Repr] = new Mapping[s.Repr] {
override final val schema: Schema = s
override def reify(repr: schema.Repr): s.Repr = repr.asInstanceOf[s.Repr]
override def reflect(value: s.Repr): schema.Repr = value.asInstanceOf[schema.Repr]
}
}
注意执行reify和反射中的asInstanceOf。我相信这些都是毫无意义的,因为"架构"总是等于" s"。有没有惯用的方法来实现这种模式,没有类型转换?第二个问题:是否存在任何微妙的原因" s"可能是不同的"架构"还是scalac对价值平等一无所知?
答案 0 :(得分:4)
问题在于这一行:
SlidingAnimator
override final val schema: Schema = s
过于笼统,有一个抽象的Schema
。
要么给它单Repr
类型,要么提供一个类型细化,指定s
为Repr
。