Scala 对具有类型参数的类进行子类化

Scala 对具有类型参数的类进行子类化,scala,Scala,在scala中尝试一些基本的绘图工具,遇到了一些我认为社区可以帮助的东西 首先。我定义了一个图形特征 trait GraphLike[T] { ... } 还有一个小班 class DiGraph[T] extends GraphLike[T] { ... } 我还有一个“面包优先搜索”类,看起来像这样: class BreadthFirstSearch[ T ]( val graph: GraphLike[T], val sourceVertex: T ) extends Graphsea

在scala中尝试一些基本的绘图工具,遇到了一些我认为社区可以帮助的东西

首先。我定义了一个图形特征

trait GraphLike[T] { ... }
还有一个小班

class DiGraph[T] extends GraphLike[T] { ... }
我还有一个“面包优先搜索”类,看起来像这样:

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 BroadthFirstSearch时遇到编译器错误

BroadthFirstSearch采用类似于图形的参数。SAP类有一个graph:DiGraph[T],DiGraph是GraphLike的子类,因此我希望能够使用DiGraph类型的graph参数调用BreadthFirstSearch的构造函数,因为DiGraph是GraphLike

但是,编译器说:

type mismatch; found : com.KGraph.DiGraph[T(in class SAP)] required: com.KGraph.GraphLike[T(in class 
 inSap)]
我不喜欢用子类有向图代替图形。你知道为什么会这样吗?我猜这可能与类型参数有关。所有类在类型参数上都是不变的


我认为除了类构造函数定义之外,不需要其他任何东西来帮助解决这个问题,但是,如果需要更多的代码来解决问题,请更新,我将提供代码

定义内部类时:

  class inSap[T]( val v: T, val w: T )

您引入了第二个类型变量
T
。因此,当您调用
new BreadthFirstSearch[T]
时,它使用的是
inSap
中的
T
,而不是
SAP
中的
T
。您应该只需要从
inSap
中删除类型参数,以便在该类中,
T
只引用外部范围中的类型。

定义内部类时:

  class inSap[T]( val v: T, val w: T )
您引入了第二个类型变量
T
。因此,当您调用
new BreadthFirstSearch[T]
时,它使用的是
inSap
中的
T
,而不是
SAP
中的
T
。您应该只需要从
inSap
中删除类型参数,以便在该类中,
T
只引用外部范围中的类型