2011-01-22 16 views
3

非常に一般的なプレフィックスツリーを作成することで、新しいScalaコレクションフレームワークを学びたいと思っていました。キーと値はパラメータである必要があるだけでなく、各ノードで使用されるマップのタイプもパラメータでなければなりません。だから私はこれを試してみました:Scalaコレクションを入力する

import collection.immutable.MapLike 

class PrefixMap[+M[K1,+V1] <: Map[K1,V1] with MapLike[K1,V1,M[K1,V1]],K,+V](val content: Option[V], val children: M[K,PrefixMap[M,K,V]]) 
    extends Map[Iterable[K],V] 
    with MapLike[Iterable[K],V,PrefixMap[M,K,V]] { 

    override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, children.empty) 
} 

しかし、これはコンパイルされません:

PrefixMap.scala:19: error: type mismatch; 
found : scala.collection.immutable.Map[K,PrefixMap[M,K,V]] 
required: M[K,PrefixMap[M,K,V]] 
    override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, children.empty) 
                      ^
one error found 

これは私を混乱させる。 MapLikeに "This"を返す空があることをドキュメントから確認できます。したがって、子はM [K、PrefixMap [M、K、V]]型であるため、children.emptyもその型でなければなりません。

何がうまくいかず、改善することができますか?

答えて

3

さて、問題はMapLikeThisを返しemptyを定義するということですが、Map.empty戻りMap!例えば

してみてください:

override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, (children: MapLike[K,PrefixMap[M,K,V],M[K,PrefixMap[M,K,V]]]).empty) 

あなたはMapの種類を隠しているので、これは、コンパイルされます。抽象メソッドがないためコードがコンパイルされませんが、それは別の問題です。

関連する問題