6
以下代碼:路徑依賴類型 - 以下代碼有什麼問題?
trait Foo {
type T
val x: T
}
trait Bar {
type F <: Foo { type T <: F }
}
class C[B <: Bar](val f: B#F) {
val x: f.T = f.x
}
由Scala編譯器(2.11.5)用下面的錯誤消息被拒絕:
error: type mismatch;
found : C.this.f.x.type (with underlying type C.this.f.T)
required: this.T
val x: f.T = f.x
^
如果省略了明確的類型聲明,類型是正確地推斷根據來自導電型測量儀相的輸出:
private[this] val x: C.this.f.T = C.this.f.x;
<stable> <accessor> def x: C.this.f.T = C.this.x
問題也消失如果F
內側結合的被改變爲一個類型爲不是Bar
成員,即
type F <: Foo { type T <: Foo }
正常工作。
這是一個錯誤?或者我的一些根本的誤解?或者一些神祕的功能?
謝謝你的興趣。有趣的是,如果沒有這個聲明,編譯器會像問題中提到的那樣將'x'的類型作爲'f.T'本身來引用。而且,它允許在使用'Foo'和'C'的代碼中使用它。所以唯一的問題是明確的聲明 - 因此我的困惑。 – 2015-02-08 23:43:42