2017-06-18 11 views
0

私は値とコンテキストをケースクラスの型にバインドしています。ある関数では、このケースクラスとそれに含まれる値をバインドされたコンテキストで使用したいと考えています。クラスにバインドされたコンテキストを使用する方法

例:

object Example { 
    trait ObjectLike[A] { 
    def properties(a: A): Map[String, Any] 
    } 

    case class Person(name: String, age: Int) 

    object Person { 
    implicit val personObjectLike = new ObjectLike[Person] { 
     override def properties(a: Person): Map[String, Any] = Map(
     "name" -> a.name, 
     "age" -> a.age 
    ) 
    } 
    } 

    case class Company(name: String, founded: Int) 
    object Company { 
    implicit val companyObjectLike = new ObjectLike[Company] { 
     override def properties(a: Company): Map[String, Any] = Map(
     "name" -> a.name, 
     "founded" -> a.founded 
    ) 
    } 
    } 

    // I have the case class with the context bound here. 
    case class ObjectStore[Obj : ObjectLike](objs: List[Obj]) 

    // Here is the function where I want to use it 
    def getNames[A](store: ObjectStore[A]): List[String] = { 
    store.objs 
     .map((a) => { 
     implicitly[ObjectLike[A]].properties(a).get("name").map(_.toString) 
     }) 
     .flatten 
    } 
} 

しかし、これはコンパイルされません。それはすでにそこに私が考えるあるべきなエラーメッセージが、私は暗黙の証拠とgetNamesの署名を変更する必要はありません

Error:(32, 19) could not find implicit value for parameter e: Example.ObjectLike[A] 
     implicitly[ObjectLike[A]].properties(a).get("name").map(_.toString) 

Error:(32, 19) not enough arguments for method implicitly: (implicit e: Example.ObjectLike[A])Example.ObjectLike[A]. 
Unspecified value parameter e. 
     implicitly[ObjectLike[A]].properties(a).get("name").map(_.toString) 

注意が、私は何とかクラスからそれを召喚したいです。

+0

どのように暗黙の証拠を追加せずにクラスからそれを召喚しますか?あなたはクラスが何であるか分からず、ジェネリック型パラメータです。 –

答えて

0

ObjectStoreの方法でエビデンスを公開することができます。

case class ObjectStore[Obj : ObjectLike](objs: List[Obj]) { 
    def evidence = implicitly[ObjectLike[Obj]] 
} 

次に、store.evidenceを使用してアクセスできます。

関連する問題