没有无意义的转换的 Scala 依赖产品

Scala dependent products without pointless casts

我按以下方式使用路径相关类型:

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

注意具体化和反映中的asInstanceOf。我认为这些毫无意义,因为 "schema" 总是等于 "s"。是否有任何惯用的方法来实现这种模式,而无需类型转换?第二个问题:"s" 可能与 "schema" 不同,是否有任何微妙的原因,或者 scalac 只是不知道值相等?

问题出在这一行:

    override final val schema: Schema = s

Schema过于笼统,有抽象Repr。 要么给它单例类型 s,要么提供一个类型细化,将 Repr 指定为 s.Repr.