背景信息:我目前正試圖建立一個通用圖庫,其中包括幾種不同的搜索算法(我已經開始使用Dijkstra的)。我已經建立了幾個特徵來表示會在某些類型的圖表中找到方法(如權重,指導):斯卡拉未能推斷出正確的類型參數
trait GraphOps[V,E] { ... }
trait WeightedGraphOps[V,E] extends GraphOps[V,E] { ... }
trait DirectedGraphOps[V,E] extends GraphOps[V,E] { ... }
object GraphOps{
def Dijkstra[V,E,G <: WeightedGraphOps[V,E] with DirectedGraphOps[V,E]](graph:G, start:V) = { ... }
}
在其他地方,我有一個類的具體實現加權,有向圖的我想上運行Dijkstra算法:
class GraphMap[T](...)
extends scala.collection.mutable.Map[Position,T]
with WeightedGraphOps[Position,Edge] with DirectedGraphOps[Position,Edge] { ... }
但是,當我試圖測試一下:
val graph = new GraphMap[Int](...)
val (dist, prev) = GraphOps.Dijkstra(graph, Position(0,0))
問題:在編譯期間我收到以下錯誤:error: inferred type arguments [com.dylan.data.Position,Nothing,com.dylan.data.GraphMap[Int]] do not conform to method Dijkstra's type parameter bounds [V,E,G <: com.dylan.data.WeightedGraphOps[V,E] with com.dylan.data.DirectedGraphOps[V,E]]
我花了很長時間才發現它推斷我的Edge(E
)類型爲Nothing
,但我不明白爲什麼它無法成功推斷它應該是Edge
。爲什麼它無法推斷該類型參數,我該如何解決它?
P.S.我試着做以下,並得到它的工作,但是這似乎可怕的不方便什麼應該是一個方便的方法:
type Helpful = WeightedGraphOps[Position,Edge] with DirectedGraphOps[Position,Edge]
val (dist, prev) = GraphOps.Dijkstra[Position,Edge,Helpful](graph, Position(0,0))
你知道這裏有一個圖庫,不是嗎? –
因爲我這樣做是爲了愛好,而且因爲幾分鐘的四處搜索並沒有導致明確的答案,所以我想我可能會把自己放在一起。 – Dylan
我很好奇你什麼條件,你完全谷歌?我試過'scala圖庫',並得到了這個:http://code.google.com/p/scala-graphs/對你來說不是這樣嗎? – AndreasScheinert