我正在尝试让我的图实现其边缘的遍历。 我有一种称为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是类泛型的组成。
答案 0 :(得分:1)
目前尚不清楚您要通过实现自定义TraversableFactory
来实现什么。这些机制可以支持通用集合,即可以存储 任意 类型的元素的集合。这很重要,因为受支持的方法包括可以更改元素类型的方法,例如.map
。在以下代码中,intCol
和mapped
的预期类型是什么:
val graph: Graph[SomeNode, SomeType] = ???
val intCol = graph.companion.empty[Int]
val mapped = graph.map(edge => 42) // yes fixed value just for an example
intCol
和mapped
绝对应该是Traversable[Int]
的某些子类型。您可以Graph
表示这样的对象吗?如果不是,则您的Graph
不是通用集合,并且不应具有自定义的companion
TraversableFactory
对象。
P.S。由于您没有提供任何关于您真正要实现的目标的描述,因此很难猜测,但是可能您真正想要的是继承自TraversableLike
(或IterableLike
)而不是Traversable
。主要区别在于TraversableLike
没有定义companion
,因此可以仅表示一种类型的集合。