泛型函数中的隐式转换
Implicit conversions in generic function
我需要将 Any 转换为基本数字类型,如 Int 或 Double。我通过使用 Scala implicits 实现了这些转换。我的代码与此类似:
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
通用类型来帮助编译器,但它没有用。
我该如何解决?
谢谢。
您需要添加隐式参数 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
这样的暗示在我看来很可疑,但这可能只是下意识的反应。
我需要将 Any 转换为基本数字类型,如 Int 或 Double。我通过使用 Scala implicits 实现了这些转换。我的代码与此类似:
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
通用类型来帮助编译器,但它没有用。
我该如何解决?
谢谢。
您需要添加隐式参数 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
这样的暗示在我看来很可疑,但这可能只是下意识的反应。