递归隐式参数

时间:2018-05-01 21:20:05

标签: scala implicit

想象一下以下代码:

trait Converter[T] {
  def convert(value: String): T
}

object Converter {
  implicit val intConverter: Converter[Int] = value => value.toInt
  implicit def optionConverter[T]: Converter[Option[T]] = new OptionConverter[T]
}

class OptionConverter[T](implicit val ev: Converter[T]) extends Converter[Option[T]] {
  ...
}

正如您所看到的,OptionConverter为其包含的类型接受Converter[T],但编译器会抱怨,因为当它尝试编译OptionConverter时,它不知道类型。< / p>

我想这可能已经解决了......但我无法找到解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以接受包裹的Converter作为optionConverter方法的隐式参数:

implicit def optionConverter[T](implicit ev: Converter[T]): Converter[Option[T]] = new OptionConverter[T]

或简写:

implicit def optionConverter[T : Converter]: Converter[Option[T]] = new OptionConverter[T]