Scala 使用Trait w/Implicits的Case类中的类型参数
假设我们有一个特点:Scala 使用Trait w/Implicits的Case类中的类型参数,scala,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 T
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]
}
但是,我想做的是:
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
中使用类型参数
**不要沉迷于将字符串转换为布尔值的玩具示例;我只是用这个简单的例子来说明这个问题。编译器在调用站点
中找不到ThingToThing[String,B]
(B
未知)。to[B]
:
case class MyClass[B](ss: Seq[String]) {
def doStuff(s: String) = Thing(s).to[B]
}
这就是错误
您可以在构造函数中声明所需的隐式,以便在对象创建的调用站点中解析它(当B
已知时):
,或在方法中声明它,以便在方法调用的调用站点中解析它(当B
已知时):
好极了非常感谢你!