我有以下代码实现广度优先搜索。返回相同类型的功能已通过
trait State{
def successors:Seq[State]
def isSuccess:Boolean = false
def admissableHeuristic:Double
}
def breadthFirstSearch(initial:State):Option[List[State]] = {
val open= new scala.collection.mutable.Queue[List[State]]
val closed = new scala.collection.mutable.HashSet[State]
open.enqueue(initial::Nil)
while (!open.isEmpty){
val path:List[State]=open.dequeue()
if(path.head.isSuccess) return Some(path.reverse)
closed += path.head
for (x <- path.head.successors)
if (!closed.contains(x))
open.enqueue(x::path)
}
return None
}
如果我定义的State
亚型为我的具体问题
class CannibalsState extends State {
//...
}
什么使breadthFirstSearch
返回相同的亚型,因为它传递的最佳方式?
假如我改变这一点,以便有针对我的特殊问题3个不同的状态类,它们都有一个共同的超类型:
abstract class CannibalsState extends State {
//...
}
class LeftSideOfRiver extends CannibalsState {
//...
}
class InTransit extends CannibalsState {
//...
}
class RightSideOfRiver extends CannibalsState {
//...
}
我怎样才能让工种出来,这样breadthFirstSearch
推断正确的返回当它通过LeftSideOfRiver
的实例时,类型为CannibalsState
?
这可以用抽象类型成员来完成,还是必须用泛型来完成?