导入时无法找到隐式参数(来自对象)

问题描述:

为什么下面的代码找不到从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$2: MyProducers.ListProducer[Int])Int. 
Unspecified value parameter evidence$2. 
    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$2: MyProducers.ListProducer[String])String. 
Unspecified value parameter evidence$2. 
    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 
} 

任何想法,为什么第一个代码不能编译,而第二个呢?

+1

隐式vals和defs *必须*有类型注释 - 尝试。 – Daenyth

+0

谢谢,那工作:) – jhegedus

隐式的vals和defs需要对它们进行类型注释。添加这些,并且会发现暗示。