我磨合了我的Scala技能,並且正在編寫幾個圖形加密算法。我有圖形的API表示這是這樣的創建類型參數取決於組合對象的Scala類的好方法類型
trait GraphLike[T]
{
val vertices: Map[ T, VertexLike[T] ]
def addVertex(t: T): GraphLike[T]
def addEdge(a:T, b:T): GraphLike[T]
def getAdjacencyList(a: T): List[T]
def getVertex(a: T): VertexLike[T]
...
}
然後我有另一個類:
class DepthFirstSearch[ T ](val graph: GraphLike[T], val sourceVertex: T)
{
...
}
目前,我發現,我這樣做是爲了創建深度優先搜索
類的一個實例val dfs = new DepthFirstSearch[Integer](new UnDirGraph[Integer](/*some params*/), 1)
其中UnDirGraph
爲GraphLike
亞類
我必須在new DepthFirstSearch[Integer]
中指定類型參數。有沒有類型檢查器可以從提供的圖形參數中推斷出這種方式。我發現我不能 做這樣的事情
val dfs = new DepthFirstSearch(new UnDirGraph[Integer](/*some params*/), 1)
目前上述失敗...有什麼樣的上面可以做的方法嗎?
編輯:所以我得到的錯誤信息是 類型不匹配;發現:com.KGraph.GraphLike [Integer]
必需:com.KGraph.GraphLike [任意] 注:整數<:任何,但特性GraphLike在類型T中是不變的 。您可能希望將T as定義爲T 。 (SLS 4.5)
這是我嘗試創建
val graph = Graphing.createUndiGraphFromFile(
new File("/Volumes/Data/Users/kartik/ScalaSpace/Graph/tinyG.txt"))
val dfs = new DepthFirstSearch(graph, 0)
其中crateUndiGraphFromFile
返回一個圖式流[整數]
多一點信息就好了。例如,什麼是錯誤信息? – Felix 2013-04-22 16:10:31
它推斷類型/強制執行'T'的一致綁定,但它不會自動查找和調用構造函數。你可以做那些反思。你必須得到一個'ClassTag'(編譯器會爲你做,如果你問的話),然後陷入困境。而且由於你需要的不是默認的(無參數)構造函數,所以它更適合默認的構造函數。我知道Java反射可以用於這種事情(我已經完成了),但我不熟悉這方面的2.10 Scala反射功能。有可能這種方式不那麼醜陋。 – 2013-04-22 16:31:49
@Kartik Aiyer:現在沒有時間給出正確的答案,但你應該知道'Integer'指的是'java.lang.Integer'而不是原始的'scala.Int'。將'Integer'更改爲'Int'可能會解決您的問題(我在repl中快速嘗試過,並且'Integer'有差異錯誤,但沒有'Int')。 @Randall Schulz:我認爲你不知何故誤解了這個問題。 – 2013-04-22 16:49:58