2011-01-22 80 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

好了,問題是,MapLike定義empty返回This,但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的類型。代碼不會編譯,因爲它缺少抽象方法,但這是另一回事。