Scala中具有自递归类型的对象的集合

时间:2019-01-18 07:16:48

标签: scala recursive-type

trait Node[N<:Node[N]] { self:N =>
}

trait A extends Node[A]

trait B {
  def list:List[Node[_]]

  def as:List[A] = list.collect { case x:A => x }
}

我在集合中使用自递归类型遇到一些麻烦。在此示例中,编译器给出错误

 def as = list.collect { case x:A => x }
                       ^
type arguments [_$1] do not conform to trait Node's type parameter bounds [N <: Node[N]]

因为列表[Node [_]]中的通配符不符合类型绑定。有什么适当的方法可以指定通配符类型来递归绑定? 一种解决方法是

  def as = {
    list match {
      case list:List[Node[n]] => list.collect { case x:A => x }
    }
  }

这很丑。

2 个答案:

答案 0 :(得分:0)

这似乎起作用:

trait B {
  def list: List[_ <: Node[_]]

  def as:List[A] = list.collect { case x:A => x }
}

答案 1 :(得分:0)

您可以使用存在的方法解决

trait Node[N<:Node[N]] { self:N =>
}

trait A extends Node[A]

trait B {
  def list:List[X forSome {type X <: Node[X]}]

  def as:List[A] = list.collect { case x:A => x }
}

公正的警告forSome将在某个时候从scala中删除。您能告诉我们更多有关您要做什么的信息吗?五月,有一种更优雅的方式做到这一点