为什么此 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}]”。有解决方法吗?</didom-fragment">
Edit:正如已经指出的,一致性错误源于未能验证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]
尽管这里的类型细化似乎没有添加任何新信息。 (也可以看看为什么带有类型投影的循环引用是非法的? https://stackoverflow.com/questions/6719827/why-is-this-cyclic-reference-with-a-type-projection-illegal)
我的动机是创造一种特质Foo[S <: T]
专门从事S#A
,如:如何专注于 Scala 中的类型投影? https://stackoverflow.com/questions/6631155/how-to-specialize-on-a-type-projection-in-scala为了让它发挥作用,我正在尝试浮出水面S#A
作为显式参数A0
在实施特征中GenFoo
,可以直接专门化。我希望将迈尔斯·萨宾(Miles Sabin)的答案中的类型细化思想应用到为什么带有类型投影的循环引用是非法的? https://stackoverflow.com/questions/6719827/why-is-this-cyclic-reference-with-a-type-projection-illegal但我遇到了这个一致性错误。