2011-01-22 3 views
3

매우 일반적인 접두사 트리를 만들어 새로운 스칼라 컬렉션 프레임 워크를 배우고 싶었습니다. 키와 값은 매개 변수 여야 할뿐만 아니라 각 노드에서 사용되는 맵의 유형도 매개 변수 여야합니다.스칼라 컬렉션 입력

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! 예를 들어

시도 : 당신이 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) 

이 컴파일됩니다. 추상 메소드가 없기 때문에 코드가 컴파일되지 않지만 또 다른 문제입니다.