以下内容:
trait Foo {
type T
val foo: T
}
trait Bar extends Foo {
type T = this.type
val foo = this
}
给出编译器错误:
<console>:8: error: overriding value foo in trait Foo of type Bar.this.T;
value foo has incompatible type
val foo = this
^
但是,如果我将最后一行更改为:
val foo: this.type = this
它编译没有错误。
为什么我必须在此明确指定类型?我已经说过foo
的类型应该是T
而T
应该是this.type
。 this
的类型不是this.type
吗?
答案 0 :(得分:6)
Scala编译器永远不会自动推断像this.type
这样的单例类型。它们在某种程度上“过于具体”,并会在其他更常见的情况下导致奇怪的行为。
关于同一主题,另见: