使用具有Implicits的特征在案例类中键入参数

时间:2017-04-15 00:33:09

标签: scala

我们说我们有一个特点:

trait ThingToThing[-A, +B] { def apply(a: A): B }

及其配套对象:

object ThingToThing {
  implicit object StringToBoolean extends ThingToThing[String, Boolean] {
    override def apply(a: String): Boolean = a.toBoolean
  }
}

和案例类:

case class Thing[A](a: A) {
  def to[B](implicit thing: ThingToThing[A, B]): B = thing(a)
}

这允许我执行以下操作:

Thing("true").to[Boolean]
res0: Boolean = true

这一切都很好,花花公子,我可以这样做:

case class MyClass(ss: Seq[String]) {
  def doStuff(s: String) = Thing(s).to[Boolean]
}

但是,我想做的事情是:

case class MyClass[B](ss: Seq[String]) {
  def doStuff(s: String) = Thing(s).to[B]
}

但是,这个错误包含:

error: could not find implicit value for parameter thing: ThingToThing[String,B]

我可以在MyClass中使用类型参数吗?

**不要陷入将String转换为布尔值的玩具示例;我只是用这个作为一个简单的例子来说明问题。

1 个答案:

答案 0 :(得分:5)

编译器在调用网站ThingToThing[String,B]中找不到BThing(s).to[B]未知)的隐式实例:

case class MyClass[B](ss: Seq[String]) {
  def doStuff(s: String) = Thing(s).to[B]
}

因此错误。

您可以在构造函数中声明必需的隐含,以便在对象创建的调用站点中解析它(当B已知时):

case class MyClass[B](ss: Seq[String])(implicit t2t: ThingToThing[String, B]) {
  def doStuff(s: String) = Thing(s).to[B]
}

,或在方法中声明它在方法调用的调用站点中解析(当B已知时):

case class MyClass[B](ss: Seq[String]) {
  def doStuff(s: String)(implicit t2t: ThingToThing[String, B]) = Thing(s).to[B]
}