Scala自定义可遍历的Seq [A]

时间:2019-01-10 20:22:02

标签: scala generics scala-collections

我正在尝试让我的图实现其边缘的遍历。 我有一种称为Edge [Node,EdgeType]的边缘。 我的优势是结案。 代码如下:

class Graph[Node, Type] extends Traverasble[Edge[Node, Type]]

我看到this post关于创建自定义Traversable的信息,但是我无法使其正常工作。 我的图知道它是元素Edge,但不知道它的参数类型Node和EdgeType。我无法让工厂了解那些泛型。

object Graph extends TraversableFactory[Graph] {
    implicit def canBuildFrom[A<:Edge[_,_]]: CanBuildFrom[Coll, A, Graph[_]] = new GenericCanBuildFrom[A]
    def newBuilder[A<:Edge[_,_]] = new ListBuffer[A] mapResult (x => new Graph(x:_*))
}

我尝试使用HigherKinds,但我也看不出如何解决该问题。

您知道我该如何解决吗?每当具有某些泛型的类扩展可遍历性时,都会遇到此问题,因为Elem是类泛型的组成。

1 个答案:

答案 0 :(得分:1)

目前尚不清楚您要通过实现自定义TraversableFactory来实现什么。这些机制可以支持通用集合,即可以存储 任意 类型的元素的集合。这很重要,因为受支持的方法包括可以更改元素类型的方法,例如.map。在以下代码中,intColmapped的预期类型是什么:

val graph: Graph[SomeNode, SomeType] = ???
val intCol = graph.companion.empty[Int]
val mapped = graph.map(edge => 42) // yes fixed value just for an example

intColmapped绝对应该是Traversable[Int]的某些子类型。您可以Graph表示这样的对象吗?如果不是,则您的Graph不是通用集合,并且不应具有自定义的companion TraversableFactory对象。

P.S。由于您没有提供任何关于您真正要实现的目标的描述,因此很难猜测,但是可能您真正想要的是继承自TraversableLike(或IterableLike)而不是Traversable。主要区别在于TraversableLike没有定义companion,因此可以仅表示一种类型的集合。