2008-09-08 13 views
17

Estoy tratando de mixin el rasgo MultiMap con un HashMap así:MultiMap en Scala

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

La definición para el rasgo MultiMap es:

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

sentido de que un MultiMap de tipos A & B es Map de tipos A & Set[B], o eso me parece. Sin embargo, el compilador se queja:

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 

Parece que los genéricos me están volviendo a tropezar.

Respuesta

26

Tuve que importar scala.collection.mutable.Set. Parece que el compilador pensó que el conjunto en HashMap[Integer, Set[TreeNode]] era scala.collection.Set. El conjunto en la definición de MultiMap es scala.collection.mutable.Set.

12

Eso puede ser molesto, la sobrecarga de nombre en las colecciones de Scala es una de sus grandes debilidades.

Por lo que vale la pena, si tuviera scala.collection._ importados, que probablemente se podría haber escrito su tipo HashMap como:

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

En realidad es scala.collection._ :-) – fikovnik

+0

Tienes razón! Reparado, muchas gracias. – Calum