2017-04-07 1 views
0

Warum kann der folgende Code nicht die importierten Implits von MyProducers finden? In meinem Verständnis sollte dies gut funktionieren, weil die Implikate im Umfang sind.Implizite Parameter können beim Importieren (aus einem Objekt) nicht gefunden werden

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 
} 

Was seltsam ist, dass dieser Code kompiliert fein:

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 
} 

Jede Idee, warum der erste Code nicht kompiliert, während der zweite tut?

+1

Implizite Vals und Defs * müssen * Typ Anmerkungen haben - versuchen Sie es. – Daenyth

+0

Danke, das hat funktioniert :) – jhegedus

Antwort

3

Implizite Werte und Werte müssen Typanmerkungen haben. Fügen Sie diese hinzu, und die Implikate werden gefunden.

Verwandte Themen