Scala递归类型别名错误
我有几个函数,其唯一的参数要求是它有一些也可以增长的集合(即它可以是Queue,List,PriorityQueue等),所以我试图创建以下类型别名:
type Frontier = Growable[Node] with TraversableLike[Node,Frontier] 使用像这样的函数定义: def apply(frontier: Frontier) = ??? 但类型别名返回错误“涉及类型Frontier的非法循环引用”.有没有办法绕过非法循环引用来使用类型别名或类似的东西? 一种解决方案是使用以下内容: def apply[F <: Growable[Node] with TraversableLike[Node,F]](f: F) = ??? 但是,当函数定义看起来与类型别名完全相同时,这似乎会增加不必要的冗长.该类型也用于其他地方,因此类型别名将大大提高可读性. 解决方法
从
the spec的第4.3节开始:
所以不,没有办法直接这样做,但你可以用类型别名上的类型参数完成同样的事情: type Frontier[F <: Frontier[F]] = Growable[Int] with TraversableLike[Int,F] 现在你只需写下你的申请: def apply[F < Frontier[F]](frontier: F) = ??? 仍然比你假设的第一个版本更冗长,但比写出整个事情更短. 你也可以使用通配符简写为存在类型: type Frontier = Growable[Node] with TraversableLike[Node,_] 现在你的第一个申请将按原样运作.你只是说必须有一些类型适合那个插槽,但你不关心它是什么. 但是,在这种情况下,您是否有理由不使用Traversable [Node]?它几乎可以完成同样的事情,并且没有对其表示类型进行参数化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |