为什么在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] {
                 ^

消息类似:

错误:结构细化中的参数类型可能不会引用在该细化之外定义的抽象类型

错误:结构细化中的参数类型可能不会引用该细化的类型成员

为什么这是编译错误?

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

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

如果没有明确的类型归属,编译器将推断出有问题的“结构细化”,即看起来像这样的类型:MyTrait [X] {var x:X}.

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

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