2010-09-15 7 views
3
class Test { 
    import scala.collection._ 

    class Parent 
    class Child extends Parent 

    implicit val children = mutable.Map[String, Child]() 

    def createEntities[T <: Parent](names: String*) = names.foreach(createEntity[T]) 


    def createEntity[T <: Parent](name: String)(implicit map: mutable.Map[String, T]): Unit = map.get(name) match { 
     case None => println(name + " not defined.") 
     case _ => 
    } 
} 

Pourquoi le compilateur se plaint:valeur implicite non trouvée

erreur: n'a pas pu trouver la valeur implicite de carte du paramètre: scala.collection.mutable.Map [String, T] names.foreach (createEntity [T ])

?

Répondre

4

Si vous appelez, par exemple, createEntities[Parent]("A", "B") (que vous pouvez, parce que Parent est un sous-type de Parent), il a besoin d'un mutable.Map[String, Parent] implicite, et il n'y en a pas. Pour être plus précis, vos définitions requierent un mutable.Map[String, T] pour chaque sous-type de Parent, non seulement ceux qui sont déjà définis:

implicit def aMap[T <: Parent]: mutable.Map[String, T] = ... 
+2

Il est la 'names.foreach (createEntity [T])' appel qui exige un argument implicite. Si vous supprimez cet appel, bien sûr, il compile! –

+1

J'ai compris. Il est légal d'appeler: createEntity [Child]() mais pas createEntity [T]() car il y a une valeur implicite pour mutable.Map [String, Child] mais none pour mutable.Map [String, T] – xiefei

+0

Oui, précisément . –

Questions connexes