2013-04-22 21 views
3

我磨合了我的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) 

其中UnDirGraphGraphLike亞類

我必須在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返回一個圖式流[整數]

+0

多一點信息就好了。例如,什麼是錯誤信息? – Felix 2013-04-22 16:10:31

+0

它推斷類型/強制執行'T'的一致綁定,但它不會自動查找和調用構造函數。你可以做那些反思。你必須得到一個'ClassTag'(編譯器會爲你做,如果你問的話),然後陷入困境。而且由於你需要的不是默認的(無參數)構造函數,所以它更適合默認的構造函數。我知道Java反射可以用於這種事情(我已經完成了),但我不熟悉這方面的2.10 Scala反射功能。有可能這種方式不那麼醜陋。 – 2013-04-22 16:31:49

+2

@Kartik Aiyer:現在沒有時間給出正確的答案,但你應該知道'Integer'指的是'java.lang.Integer'而不是原始的'scala.Int'。將'Integer'更改爲'Int'可能會解決您的問題(我在repl中快速嘗試過,並且'Integer'有差異錯誤,但沒有'Int')。 @Randall Schulz:我認爲你不知何故誤解了這個問題。 – 2013-04-22 16:49:58

回答

2

貸@雷吉斯讓吉爾斯和@馬克彼得斯

常見超類型Integer1(類型Int)是Any。所以,當寫這個:

val dfs = new DepthFirstSearch(new UnDirGraph[Integer](/*some params*/), 1) 

類型推理給你

val dfs = new DepthFirstSearch[Any](new UnDirGraph[Integer](/*some params*/), 1) 

但是現在,我們需要

new UnDirGraph[Integer](/*some params*/) <: UniDirGraph[Any] 

這是並非如此,因爲UnDirGraph是不變的。

如果你寫:

val dfs = new DepthFirstSearch[Integer](new UnDirGraph[Integer](/*some params*/), 1) 

斯卡拉將隱式轉換1Integer,然後一切都很好。

正如@雷吉斯讓 - 吉爾指出,下面的工作:

val dfs = new DepthFirstSearch(new UnDirGraph[Int](/*some params*/), 1) 
相關問題