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 }
}
}
这很丑。
答案 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中删除。您能告诉我们更多有关您要做什么的信息吗?五月,有一种更优雅的方式做到这一点