为什么在Scala中将具有默认值的特征实例化为编译错误?

时间:2015-09-19 01:51:35

标签: scala

通过编译以下代码可以重现错误:

object ReproducingMyError {

  trait MyTrait[X] {
    def someFunc: X
  }

  def f[X] = new MyTrait[X] {
    var x: X = _
    def someFunc: X = x
  }

}

生成了2条错误消息。两者都指向

  def f[X] = new MyTrait[X] {
                 ^

消息类似:

Error: Parameter type in structural refinement may not refer to an abstract type defined outside that refinement

Error: Parameter type in structural refinement may not refer to a type member of that refinement

为什么这是编译错误?

1 个答案:

答案 0 :(得分:2)

如果您不需要公开var外部(我假设您没有),那么添加显式返回类型可以解决问题:

def f[X]: MyTrait[X] = new MyTrait[X] {
  var x: X = _
  def someFunc: X = x
}

如果没有显式类型归属,编译器将推断出有问题的“结构细化”,即类似于MyTrait[X] { var x: X }的类型。

另一种解决方法是将var声明为private - 这样它就不会被外面的任何人看到,因此 - 不会包含在推断的细化类型中。

def f[X] = new MyTrait[X] {
  private var x: X = _
  def someFunc: X = x
}