【问题标题】:Implicit conversions in generic function泛型函数中的隐式转换
【发布时间】:2018-12-08 08:28:30
【问题描述】:

我需要从 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 类型并绑定 Tgeneric 类型来帮助编译器,但没有成功。

我该如何解决?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    您还需要将隐式参数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 这样的隐含在我看来很可疑,但这可能只是一种下意识的反应。

    【讨论】:

    • 谢谢!!有效。我花了很多时间在它上面,它终于奏效了。我展示的anyToDouble/Int 只是一个例子。真正的代码更复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多