以下伪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]] ...
这可以被当作是具有约束CCD_ 5的CCD_。
如果这项技术是可行的,它可能也有助于解决以下问题:如何在Scala中专门处理类型投影?
注意:我可以在任何地方使用GenT
而不是T
,但我尽量避免这种情况,因为这会导致大量类型参数"传染性"地传播到我的所有代码中。
下面的两个问题看起来很相似,但关于一种不同类型的循环引用:
- Scala:围绕";非法循环引用">
- 如何定义循环类型定义
在您的初始示例中,您可以通过在GenT[A]和T之间引入辅助类型来打破循环,
trait GenT[A]
trait TAux { type A }
trait T extends TAux with GenT[TAux#A]
但从你的激励榜样来看,我认为你不需要走这条路。你所追求的约束可以直接使用一种改进来表达
trait T { type A }
def foo[A0, S1 <: T { type A = A0 }, S2 <: T { type A = A0 }] ...
还要记住,您可以通过类型别名将类型成员表面化为类型参数
trait T { type A }
type TParam[A0] = T { type A = A0 }
def foo[A0, S1 <: TParam[A0], S2 <: TParam[A0]] ...