2008-09-08 34 views
17

Ich versuche, die MultiMap Eigenschaft mit einem HashMap wie so mixin:MultiMap in Scala

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

die Definition für das MultiMap Merkmal ist:

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

Was bedeutet, dass ein MultiMap von Typen A & B ist ein Map der Typen A & Set[B], oder so scheint es mir. Allerdings beschwert sich der Compiler:

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 

Es scheint, dass Generika mich wieder stolpern.

Antwort

26

Ich musste scala.collection.mutable.Set importieren. Es scheint, dass der Compiler dachte, das Set in HashMap[Integer, Set[TreeNode]] war scala.collection.Set. Das Set im MultiMap-Def ist scala.collection.mutable.Set.

12

Das kann nervig sein, der Name in Scalas Kollektionen zu überladen ist eine seiner großen Schwächen.

Für das, was es wert ist, wenn Sie scala.collection._ importiert hatten, werden Sie wahrscheinlich haben könnte Ihre HashMap Typ wie geschrieben:

new HashMap[ Integer, mutable.Set[ TreeNode ] ] 
+1

Es ist eigentlich scala.collection._ :-) – fikovnik

+0

Sie haben recht! Fest, vielen Dank. – Calum