scala – 为什么这种带有类型投影的循环引用是非法的?
以下伪
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]] ... 这可以被使用,就好像它是具有S1#A == S2#A的约束的def foo [S1 <:T,S2
注意:我可以在任何地方使用GenT而不是T,但是我试图避免这种情况,因为它会导致大量的类型参数传播到所有我的代码“传染性”. 下面的两个问题看起来是相似的,但是关于不同类型的循环引用: > Scala: working around the “illegal cyclic reference” 解决方法
在您的初始示例中,您可以通过在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]] ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Scala,Maven,Sbt和Eclipse
- scala – 如何在Phantom for Cassandra中使用和查询动态列族
- PolymerDart自定义元素,具有与Angular.dart模型的双向绑定
- 属性未定义Angular2和TypeScript
- Bootstrap---Fluid layout 流布局
- angle-ui-grid – 隐藏水平滚动条(Angular ui-grid)
- Redis系列五:redis键管理和redis数据库管理
- Scala – 方法优先
- 谁用xfire做webservice的断点续传功能啊?急!!!
- 如何在Angular 2中将Object传递给NgStyle指令?