给定一个具有“转换器”的类型,我想使用该类型的伴随对象对方法调用进行自动转换。也就是说,给定以下定义,
case class Converted(name: String)
trait Converter[A] {
def perform: Converted
}
implicit val StringConverter = new Converter[String] {
def perform = Converted("String")
}
使以下代码工作:
implicit def toConverter(a: String.type): Converted =
implicitly[Converter[String]].perform // Error: `Found String.type, required AnyRef`
def f(needsConverted: Converted) = ???
f(String) // <- That's what I would like to be able to write.
但这失败了,两次转换尝试都失败了。请注意,我无法更改f
,因为它是由第三方库提供的并且其中有很多。
- 我可以
f(String)
使用隐式进行编译吗?
如果字符串不可能,那么具有伴生对象的类呢,我一般可以这样做吗:
object TheClass
case class TheClass()
implicit val TheClassConverter = new Converter[TheClass] {
def perform = Converted("TheClass")
}
implicit def toConverter[A: Converter](a: A.type): Converted =
implicitly[Converter[A]].perform // Error: `Not found value A`
implicit def toConverter(a: TheClass.type): Converted =
implicitly[Converter[TheClass]].perform // This works but is not generic
f(TheClass) // This works.
- 我可以先
toConverter
编译吗?