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 を使用するのは好きではありません。なぜこれが起こるのでしょうか?これは、型パラメーターに関係している可能性があると推測しています。すべてのクラスは型パラメーターで不変です。
これを支援するためにクラス コンストラクターの定義以外に必要なものはないと思いましたが、それを理解するためにさらにコードが必要な場合は、更新してください。コードを提供します。