パス依存型を返すメソッドを設計するにはどうすればよいですか?パス依存型を返す
:構築することができない、次の今trait Tree {
trait Vertex
def root: Vertex
def addChild(parent: Vertex): Vertex
}
trait TreeFactory { def make: Tree }
次の例では、私は意図的Vertex
は、木全体で頂点をミックスすることは禁止(これは単なる一例である)されていることを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"
-Ydependent-method-typesを使用していない場合は、これ(従属型で依存する値をパッケージ化する)が推奨されます。 –
ありがとうございます、それは動作します。私が思ったように、 '-Xexperimental'は必要ないので、なぜこれを明示的に有効にする必要があるのだろうか? –