加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala递归类型别名错误

发布时间:2020-12-16 19:17:43 所属栏目:安全 来源:网络整理
导读:我有几个函数,其唯一的参数要求是它有一些也可以增长的集合(即它可以是Queue,List,PriorityQueue等),所以我试图创建以下类型别名: type Frontier = Growable[Node] with TraversableLike[Node,Frontier] 使用像这样的函数定义: def apply(frontier: Fronti
我有几个函数,其唯一的参数要求是它有一些也可以增长的集合(即它可以是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节开始:

The scope rules for definitions (§4) and type parameters (§4.6) make
it possible that a type name appears in its own bound or in its
right-hand side. However,it is a static error if a type alias refers
recursively to the defined type constructor itself.

所以不,没有办法直接这样做,但你可以用类型别名上的类型参数完成同样的事情:

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]?它几乎可以完成同样的事情,并且没有对其表示类型进行参数化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读