2013-05-06 33 views
0

在scala中尝试一些基本的图形材料,并遇到了一些我认为SO社区可以提供帮助的东西。对具有类型参数的类进行子类化

首先。我有一个图表特征定义

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) 
    } 
} 

我在调用新的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)] 

它不使用子类有向图代替图式流的喜欢我。任何想法为什么会发生?我猜这可能与类型参数有关。所有的类对于类型参数都是不变的。

我不认为除了类构造函数定义以外的任何东西都需要帮助,但是,如果需要更多代码来计算东西,请更新并提供代码。

回答

3

当你定义了内部类:

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

你推出一个名为T第二类型的变量。因此,当您拨打new BreadthFirstSearch[T]即使用的T,而不是的SAP。您应该只需要从inSap中删除类型参数,以便该类内部的T只引用外部范围中的类型。

+0

哇...小白...:P ....非常感谢您的帮助...... – 2013-05-07 14:30:26

相关问题