没有无意义的转换的 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
.
我按以下方式使用路径相关类型:
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
.