0

这是由路径依赖类型引起的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,并在没有盲目类型转换的情况下生成正确的类型签名?

4

1 回答 1

1

而不是Outer#Inner,您需要Outer使用类型参数来约束类型。尝试

def cp[O <: Outer](src: O#Inner): O#Inner = src.copy()

这将让您维护O#Inner,它指的是一种特定类型,而不是Outer#Inner.

在Scastie中看到它。

于 2021-04-11T23:16:00.507 回答