2010-09-15 2 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 _ => 
    } 
} 

Почему компилятор жалуется:неявное значение не найдено

ошибка: не удалось найти неявное значение для отображения параметра: scala.collection.mutable.Map [String, T] names.foreach (CreateEntity [T ])

?

ответ

4

Если вы звоните, например, createEntities[Parent]("A", "B") (который вы можете, потому что Parent является подтипом Parent), она нуждается в неявной mutable.Map[String, Parent], и не один. Чтобы быть более точным, ваши определения требуют, чтобы поставить mutable.Map[String, T] для каждый подтип Parent, а не только те, которые уже определены:

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

Это 'names.foreach (CreateEntity [T])' вызов, который требует неявный аргумент. Если вы удалите этот звонок, он, конечно же, скомпилируется! –

+1

Получил это. Это законно для вызова: createEntity [Child](), но не createEntity [T](), потому что существует неявное значение для mutable.Map [String, Child], но нет для mutable.Map [String, T] – xiefei

+0

Да, точно , –

Смежные вопросы