泛型函数中的隐式转换

时间:2018-06-29 07:43:51

标签: scala implicit-conversion implicit implicits scala-implicits

我需要从Any转换为基本数字类型,例如Int或Double。我通过使用Scala隐式实现了这些转换。我的代码与此类似:

  def convertAny[T](any: Any)(implicit run: Any => Option[T]) = run.apply(any)
  implicit def anyToDouble(any: Any) = Try(any.asInstanceOf[Double]).toOption
  implicit def anyToInt(any: Any) = Try(any.asInstanceOf[Int]).toOption

问题是我需要在这样的通用函数中进行这些转换:

  def doStuffAndConvert[T](i: Any): Option[T] = {
    // Some pre-processing
    println("Processing data...")

    convertAny[T](i)
  }

这是对doStuffAndConvert的呼叫:

doStuffAndConvert[Double](a)

但是,编译器会抛出此错误:

Error:(40, 18) No implicit view available from Any => Option[T].
    convertAny[T](i)

我试图通过包装Int和Double类型并限制T泛型类型来帮助编译器,但这没有用。

我该如何解决?

谢谢。

1 个答案:

答案 0 :(得分:2)

您还需要向convertAny中添加隐式参数doStuffAndConvert

def doStuffAndConvert[T](i: Any)(implicit run: Any => Option[T]): Option[T] = {
  // Some pre-processing
  println("Processing data...")

  convertAny[T](i) // or just i, the implicit will be used anyway
}

anyToDouble/Int这样的隐喻对我来说可疑,但这可能只是下意识的反应。