Как я могу разработать метод, который возвращает тип, зависящий от пути?В следующем примере я намеренно хочу, чтобы Vertex
был зависимым от пути Tree
, так что запрещено смешивать вершины между деревьями (и это только пример):
trait Tree {
trait Vertex
def root: Vertex
def addChild(parent: Vertex): Vertex
}
trait TreeFactory { def make: Tree }
Теперь следующеене может быть построено:
def test(f: TreeFactory): (Tree, Map[Tree#Vertex, Tree#Vertex]) = {
val t = f.make
var sq = IndexedSeq(t.root)
var m = Map.empty[t.Vertex, t.Vertex]
for( i <- 1 to 100) {
val p = sq(util.Random.nextInt(sq.size))
val c = t.addChild(p)
m += c -> p
sq :+= c
}
(t, m)
}
Поскольку очевидно, что карта, которую я возвращаю, должна иметь не ключи и значения типа Tree#Vertex
, а вершину, зависящую от пути ...
error: type mismatch;
found : scala.collection.immutable.Map[t.Vertex,t.Vertex]
required: Map[Tree#Vertex,Tree#Vertex]
Note: t.Vertex <: Tree#Vertex, but trait Map is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Tree#Vertex`. (SLS 3.2.10)
(t, m)
^
Если япопытаться разделить создание дерева и построение родительско-дочерней карты:
def test(t: Tree): Map[t.Vertex, t.Vertex] = {
var sq = IndexedSeq(t.root)
var m = Map.empty[t.Vertex, t.Vertex]
for (i <- 1 to 100) {
val p = sq(util.Random.nextInt(sq.size))
val c = t.addChild(p)
m += c -> p
sq :+= c
}
m
}
Это не удалось по другой причине: "error: illegal dependent method type"