2017-04-07 1 views
0

Pourquoi le code ci-dessous ne trouve-t-il pas les implicits importés de MyProducers? Selon moi, cela devrait fonctionner parce que les implicites sont dans la portée.Les paramètres implicites ne peuvent pas être trouvés lors de l'importation (à partir d'un objet)

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]() 

code:

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 
} 

Ce qui est étrange, que ce code compile bien:

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 
} 

Toute idée pourquoi le premier code ne compile pas tandis que le second fait?

+1

Les valeurs implicites vals et defs * doivent * avoir des annotations de type - essayez cela. – Daenyth

+0

Merci, cela a fonctionné :) – jhegedus

Répondre

3

Les valeurs implicites vals et defs doivent comporter des annotations de type. Ajoutez-les, et les implicits seront trouvés.