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

时间:2013-05-06 15:15:16

标签: scala

在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。知道为什么会这样吗?我猜这可能与类型参数有关。所有类在类型参数上都是不变的。

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

1 个答案:

答案 0 :(得分:3)

定义内部类时:

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

您引入了名为T的第二个类型变量。因此,当您使用new BreadthFirstSearch[T]中的T来电话inSap时,而不是来自T的{​​{1}}。您应该只需要从SAP中删除type参数,以便在该类中,inSap只引用外部范围中的类型。