爲什麼這個Scala代碼無法檢測?爲什麼這些類型參數不符合類型細化?
trait T { type A }
trait GenFoo[A0, S <: T { type A = A0 }]
trait Foo[S <: T] extends GenFoo[S#A, S]
我不明白,爲什麼 「類型的參數[S#A,S]不符合特質GenFoo的類型參數界限[A0,S <:T {類型A = A0}]」。有沒有解決辦法?
編輯:正如已經指出的,一致性錯誤源於未驗證S <: T{type A = S#A}
。丹尼爾索布拉爾指出-explaintypes
,它告訴我們:
S <: T{type A = S#A}?
S <: T?
true
S specializes type A?
this.A = this.A?
S = this.type?
false
false
false
false
我不知道如何解釋這一點。
注意,我們得到了一個非法的循環引用,如果我們試圖定義,
trait Foo[S <: T { type A = S#A } ] extends GenFoo[S#A, S]
雖然這裏的類型精化似乎並沒有添加任何新的信息。 (也Why is this cyclic reference with a type projection illegal?見)
我的動機是創造一個特點Foo[S <: T]
,專門對S#A
,如:How to specialize on a type projection in Scala?爲了得到這個工作,我試圖浮出水面S#A
作爲實施特質GenFoo
明顯的參數A0
,這可以直接專業化。我希望將Miles Sabin的答案應用於Why is this cyclic reference with a type projection illegal?,但我遇到了這種一致性錯誤。
你有沒有試過-explaintypes? –
感謝您的指針。我更新了問題以包含-explaintypes的輸出。 –