【发布时间】:2011-10-06 21:12:06
【问题描述】:
以下伪 Scala 产生“非法循环引用”错误:
trait GenT[A]
trait T extends GenT[T#A] {
type A
}
问题:为什么这是非法的?健全性是否存在根本问题,还是 Scala 类型系统的限制?有解决办法吗?
我的意图是创建一个带有类型成员A 的特征T,可以通过超特征GenT[A] 按需提升为类型参数。一种应用可能是约束的表达,例如
def foo[A, S1 <: GenT[A], S2 <: GenT[A]] ...
这可以像 def foo[S1 <: T, S2 <:T] ... 一样使用,约束条件为 S1#A == S2#A。
如果该技术可行,它也可能有助于解决这个问题:How to specialize on a type projection in Scala?
注意:我可以在任何地方使用GenT 而不是T,但我会尽量避免这种情况,因为它会导致大量类型参数“感染性地”传播到我的所有代码中。
下面的两个问题看起来很相似,但是是关于不同类型的循环引用:
【问题讨论】: