导入时找不到隐式参数(从对象)

Implicit parameters cannot be found when imported (from an Object)

为什么下面的代码找不到从 MyProducers 导入的隐含函数?以我的理解,这应该可以正常工作,因为隐式在范围内。

Error:(16, 34) could not find implicit value for evidence parameter of type MyProducers.ListProducer[Int]
  val stuffInt:Int = getHead[Int]()
Error:(16, 34) not enough arguments for method getHead: (implicit evidence: MyProducers.ListProducer[Int])Int.
Unspecified value parameter evidence.
  val stuffInt:Int = getHead[Int]()
Error:(18, 43) could not find implicit value for evidence parameter of type MyProducers.ListProducer[String]
  val stuffString:String = getHead[String]()
Error:(18, 43) not enough arguments for method getHead: (implicit evidence: MyProducers.ListProducer[String])String.
Unspecified value parameter evidence.
  val stuffString:String = getHead[String]()

代码:

object Resolver {

  import MyProducers._
  import MyProducers._

  def getList[T:ListProducer]():List[T]= implicitly[ListProducer[T]].produceList


  def getHead[T:ListProducer]():T= getList[T]().head

  val stuffInt:Int = getHead[Int]()

  val stuffString:String = getHead[String]()

  val im=ip  // this compiles fine, so implicits are in scope
  val sm=sp
}

object MyProducers{
  trait ListProducer[T]{
    def produceList:List[T]
  }
  object IntProducer extends ListProducer[Int]{
    override def produceList = List(22, 42)
  }
  implicit val ip=IntProducer

  object StringProducer extends ListProducer[String]{
    override def produceList = List("stuff", "Shiraly")
  }
  implicit val sp=StringProducer
}

奇怪的是,这段代码编译得很好:

object Resolver {

  import MyProducers._
  import MyProducers._
  trait ListProducer[T]{
    def produceList:List[T]
  }
  object IntProducer extends ListProducer[Int]{
    override def produceList = List(22, 42)
  }
  implicit val ip=IntProducer

  object StringProducer extends ListProducer[String]{
    override def produceList = List("stuff", "Shiraly")
  }
  implicit val sp=StringProducer


  def getList[T:ListProducer]():List[T]= implicitly[ListProducer[T]].produceList


  def getHead[T:ListProducer]():T= getList[T]().head

  val stuffInt:Int = getHead[Int]()

  val stuffString:String = getHead[String]()

  val im=ip
  val sm=sp
}

知道为什么第一个代码无法编译而第二个代码可以编译吗?

隐式 val 和 def 需要在它们上面有类型注释。添加这些,就会找到隐式。