trait A {
type Foo
def bar: Foo = B(this).bar
}
case class B(a: A) extends A {
type Foo = a.Foo
}
我意识到这个例子有点做作,但不应该编译吗?我收到以下错误:
<console>:9: error: type mismatch;
found : _5.a.Foo where val _5: B
required: A.this.Foo
def bar: Foo = B(this).bar
我意识到我的例子很奇怪,但很明显Foos是一样的,不是吗?因为“this”是定义Foo的路径!
我只需要施展它吗?
答案 0 :(得分:1)
以下工作正常:
trait A {
type Foo
def bar: Foo = B(this).bar
}
def B(a: A): A { type Foo = a.Foo } = new A {
type Foo = a.Foo
}
所以看起来编译器对于跟踪B
Foo
的内容并不够聪明。也许你可以说服编译器团队的人知道这是一个bug,但我不会屏住呼吸。
答案 1 :(得分:0)
使这项工作的一种方法是给Foo一个初始类型。似乎没有这种类型的推断会推断出一种与你期望的不相容的复杂类型。
(注意:如果有人对细节有更多了解,我也很想了解更多相关信息。)
trait A {
type Foo = Int
def bar: Foo = B(this).bar
}
case class B(a: A) extends A {
override type Foo = a.Foo
}