隐含的价值没有发现
问题描述:
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 [字符串,T] names.foreach(createEntity [T ])
?
答
如果调用,例如,createEntities[Parent]("A", "B")
(其可以,因为Parent
是Parent
亚型),它需要一个隐式mutable.Map[String, Parent]
,并且没有一个。更精确地说,你的定义需要你提供一个mutable.Map[String, T]
为每亚型Parent
,而不仅仅是那些已经定义:
implicit def aMap[T <: Parent]: mutable.Map[String, T] = ...
这是'names.foreach(createEntity [T])'调用,它需要一个隐含的论点。如果你删除这个调用,当然它编译! – 2010-09-15 10:32:00
明白了。调用:createEntity [Child]()但不createEntity [T]()是合法的,因为对于mutable.Map [String,Child]有一个隐式值,但对于mutable.Map [String,T]没有隐式值 – xiefei 2010-09-15 11:53:12
是的,精确的。 – 2010-09-15 12:03:31