如何使用绑定到类的上下文

时间:2017-06-18 12:42:42

标签: scala

我在case类中绑定了一个值和上下文。在函数中,我想在绑定上下文中使用此case类及其包含的值。

示例:

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
  }
} 

然而,这不会编译。错误消息是

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)

请注意,我不想用隐式证据来改变getNames的签名,我想以某种方式从类中召唤它,因为它应该已经存在于我认为。

1 个答案:

答案 0 :(得分:0)

您可以通过ObjectStore中的方法公开证据。

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

然后您可以使用store.evidence来访问它。