Я довольно новичок в Scala, но я думаю, что вы хотите здесь абстрактные типы , которые используются в примерах кода на странице, на которую вы ссылаетесь. Я думаю, что причина того, что вы получаете эту ошибку, заключается в том, что вы пытаетесь сузить тип allNodes от AbstractNode до Node. Это означает, что ваша конкретная реализация несовместима с типом AbstractGraph, и вы не можете использовать экземпляр Graph везде, где вы можете использовать AbstractGraph.
Если вы хотите сделать это, то вы хотите использовать абстрактные типы. Абстрактный тип говорит, что будет существовать некоторый тип, и конкретная реализация должна создать его экземпляр. В приведенном ниже коде AbstractGraph говорит, что конкретная реализация должна указывать тип node
, который является подтипом AbstractNode, а Graph указывает, что это тип Node
.
import scala.collection.mutable.ArrayBuffer
class AbstractNode
class Node extends AbstractNode {
def update() {
// update something here
}
}
class AbstractGraph {
type node <: AbstractNode
val allNodes = new ArrayBuffer[node]()
}
class Graph extends AbstractGraph {
override type node = Node
def updateAll() {
allNodes.foreach(_.update())
}
}