this和this.type之间的关系

时间:2011-08-05 15:20:41

标签: scala

以下内容:

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的类型应该是TT应该是this.typethis的类型不是this.type吗?

1 个答案:

答案 0 :(得分:6)

Scala编译器永远不会自动推断像this.type这样的单例类型。它们在某种程度上“过于具体”,并会在其他更常见的情况下导致奇怪的行为。

关于同一主题,另见: