为什么这个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的输出。 –