2017-04-07 6 views
0

インポートされた暗黙コードが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のコードがコンパイルされない理由を任意のアイデア?

+1

暗黙のvalとdefs *は型注釈を持つ必要があります。 – Daenyth

+0

ありがとう、それは働いた:) – jhegedus

答えて

3

暗黙的なvalとdefには、型注釈が必要です。これらを加えれば、暗黙の言葉が見つかるでしょう。

関連する問題