我有几个函数,其唯一的参数要求是它有一些也可以增长的集合(即它可以是Queue,List,PriorityQueue等),所以我试图创建以下类型别名:
type Frontier = Growable[Node] with TraversableLike[Node, Frontier]
Run Code Online (Sandbox Code Playgroud)
使用像这样的函数定义:
def apply(frontier: Frontier) = ???
Run Code Online (Sandbox Code Playgroud)
但类型别名返回错误"涉及类型Frontier的非法循环引用".有没有办法绕过非法循环引用来使用类型别名或类似的东西?
一种解决方案是使用以下内容:
def apply[F <: Growable[Node] with TraversableLike[Node, F]](f: F) = ???
Run Code Online (Sandbox Code Playgroud)
但是,当函数定义看起来与类型别名完全相同时,这似乎会增加不必要的冗长.该类型也用于其他地方,因此类型别名将大大提高可读性.
从规范的 4.3节:
定义(§4)和类型参数(§4.6)的范围规则使类型名称可以出现在其自己的边界或右侧.但是,如果类型别名以递归方式引用定义的类型构造函数本身,则它是静态错误.
所以不,没有办法直接这样做,但你可以在类型别名上使用类型参数完成同样的事情:
type Frontier[F <: Frontier[F]] = Growable[Int] with TraversableLike[Int, F]
Run Code Online (Sandbox Code Playgroud)
现在你只需写下apply这样的:
def apply[F < Frontier[F]](frontier: F) = ???
Run Code Online (Sandbox Code Playgroud)
仍然比你假设的第一个版本更冗长,但比写出整个事情更短.
您也可以使用通配符简写为存在类型:
type Frontier = Growable[Node] with TraversableLike[Node, _]
Run Code Online (Sandbox Code Playgroud)
现在你的第一个apply 将按原样工作.你只是说必须有一些类型适合那个插槽,但你不关心它是什么.
但在具体情况下,您是否有理由不使用Traversable[Node]?它几乎可以完成同样的事情,并且没有对其表示类型进行参数化.
| 归档时间: |
|
| 查看次数: |
678 次 |
| 最近记录: |