通过编译以下代码可以重现错误:
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
为什么这是编译错误?
答案 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
}