我们说我们有一个特点:
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转换为布尔值的玩具示例;我只是用这个作为一个简单的例子来说明问题。
答案 0 :(得分:5)
编译器在调用网站ThingToThing[String,B]
中找不到B
(Thing(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]
}