3

私はスカラのスキルを磨いており、いくつかのグラフ化アルゴリズムを書いています。このようなグラフのAPI表現があります

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 )
{
  ...
}

現在、DepthFirstSearch クラスのインスタンスを作成するには、これを行う必要があることがわかりました

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 )

現在、上記は失敗しています...上記のようなことができる方法はありますか?

編集:だから私が得るエラーメッセージは型の不一致です; found : com.KGraph.GraphLike[Integer]
required: com.KGraph.GraphLike[Any] Note: Integer <: Any, but trait GraphLike is invariant in type T. 代わりに T を +T として定義したいかもしれません。(SLS4.5)

これが私が作成しようとする方法です

val graph = Graphing.createUndiGraphFromFile( 
            new File("/Volumes/Data/Users/kartik/ScalaSpace/Graph/tinyG.txt" ) )
val dfs = new DepthFirstSearch( graph, 0 )

ここでcrateUndiGraphFromFile、GraphLike[Integer] を返します

4

1 に答える 1

2

@Régis Jean-Gilles と @Mark Peters の功績

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 )

1Scala は暗黙的にを anに変換しInteger、その後はすべて問題ありません。

@Régis Jean-Gilles が指摘しているように、次のように動作します。

val dfs = new DepthFirstSearch( new UnDirGraph[Int](/*some params*/), 1 )
于 2013-04-22T20:57:51.853 に答える