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 类型的图参数调用 BreadthFirstSearch 的构造函数,因为 DiGraph 是 GraphLike。

但是,编译器这样说:

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

它不喜欢我使用子类 DiGraph 代替 GraphLike。知道为什么会发生这种情况吗?我猜这可能与类型参数有关。所有类在类型参数上都是不变的。

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

4

1 回答 1

3

当你定义你的内部类时:

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

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

于 2013-05-06T15:19:03.180 回答