У меня есть следующая реализация кода поиска в ширину.
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
выводил, что правильный тип возврата равен CannibalsState
, когда ему передан экземпляр LeftSideOfRiver
?
Может ли это быть сделано с помощью абстрактного члена типа, или это должно быть сделано с помощью дженериков?