这是由路径依赖类型引起的scala问题:考虑到我有一个家庭类型:
trait Outer {
case class Inner(v: Int) {
val outer = Outer.this
}
}
如果我想Outer#Inner.copy()
在实例Outer
未知时调用:
def cp(src: Outer#Inner) = {
src.copy()
}
我会遇到编译错误。因为 src.copy() 的类型签名附加到其外部实例。
绕过这个的一种方法是手动提取外部实例:
def cp(src: Outer#Inner) = {
val o = src.outer
val _src = src.asInstanceOf[o.Inner]
_src.copy()
}
这可以编译成功,但asInstanceOf[]
显然是一个黑客制品,应该被删除。
在惯用的 scala 中,实现相同目标的最佳方法是什么,同时让 scala 编译器自动推断 的存在outer
,并在没有盲目类型转换的情况下生成正确的类型签名?