0

scalaでいくつかの基本的なグラフ作成を試してみたところ、SOコミュニティが支援できると思われるものに遭遇しました。

初め。グラフ特性が定義されています

trait GraphLike[T] { ... }

そしてサブクラス

class DiGraph[T] extends GraphLike[T] { ... }

次のようなBreadthFirstSearchクラスもあります。

class BreadthFirstSearch[ T ]( val graph: GraphLike[T], val sourceVertex: T ) extends Graphsearch.GraphSearch[ T ]{

これを次のような別のクラスで使用しようとしています。

class SAP[T]( val graph: DiGraph[T]) {

  class inSap[T]( val v: T, val w: T )
  {
    val bfsV  = new BreadthFirstSearch[T](graph, v)
  }
}

new BreadthFirstSearch を呼び出すと、コンパイラ エラーが発生します。

BreadthFirstSearch は、GraphLike パラメーターを取ります。SAP クラスにはグラフがあります。DiGraph[T] で、DiGraph は GraphLike のサブクラスです。DiGraph は GraphLike であるため、DiGraph 型のグラフ パラメーターを使用して BreadthFirstSearch のコンストラクターを呼び出すことができると期待しています。

ただし、コンパイラは次のように述べています。

type mismatch; found : com.KGraph.DiGraph[T(in class SAP)] required: com.KGraph.GraphLike[T(in class 
 inSap)]

GraphLike の代わりにサブクラス DiGraph を使用するのは好きではありません。なぜこれが起こるのでしょうか?これは、型パラメーターに関係している可能性があると推測しています。すべてのクラスは型パラメーターで不変です。

これを支援するためにクラス コンストラクターの定義以外に必要なものはないと思いましたが、それを理解するためにさらにコードが必要な場合は、更新してください。コードを提供します。

4

1 に答える 1