18

I'm trying to mixin the MultiMap trait with a HashMap like so:

val children:MultiMap[Integer, TreeNode] = 
    new HashMap[Integer, Set[TreeNode]] with MultiMap[Integer, TreeNode]

The definition for the MultiMap trait is:

trait MultiMap[A, B] extends Map[A, Set[B]]

Meaning that a MultiMap of types A & B is a Map of types A & Set[B], or so it seems to me. However, the compiler complains:

C:\...\TestTreeDataModel.scala:87: error: illegal inheritance;   template $anon inherits different type instances of trait Map:   scala.collection.mutable.Map[Integer,scala.collection.mutable.Set[package.TreeNode]] and scala.collection.mutable.Map[Integer,Set[package.TreeNode]]  
    new HashMap[Integer, Set[TreeNode]] with MultiMap[Integer, TreeNode]  
    ^ one error found  

It seems that generics are tripping me up again.

4

2 に答える 2

26

インポートする必要がありましたscala.collection.mutable.Set。コンパイラは、Setinがであると考えていたようHashMap[Integer, Set[TreeNode]]ですscala.collection.Set。MultiMapdefのSetはです。scala.collection.mutable.Set

于 2008-09-08T18:59:25.310 に答える
12

Scala のコレクションでの名前のオーバーロードは、Scala の大きな弱点の 1 つです。

価値があるのは、scala.collection._インポートした場合、おそらくHashMap型を次のように記述できたはずです。

new HashMap[ Integer, mutable.Set[ TreeNode ] ]
于 2008-09-15T16:24:13.377 に答える