使用asInstanceOf将Any转换为Double?

时间:2014-11-27 22:54:00

标签: scala

是否支持将任何数字类型转换为double的方法。 E.g。

   val i = 12345
   val f = 1234.5F
   val d = 1234.5D
   val arr = Array[Any](i,f,d)
   val anotherD = arr(0).asInstanceOf[Numeric].toDouble

当然上面的代码不正确 - 因为Numeric需要Type参数。

scala>        val i = 12345
i: Int = 12345

scala>        val f = 1234.5F
f: Float = 1234.5

scala>        val d = 1234.5D
d: Double = 1234.5

scala>        val arr = Array[Any](i,f,d)
arr: Array[Any] = Array(12345, 1234.5, 1234.5)

scala>        val anotherD = arr(0).asInstanceOf[Numeric].toDouble
<console>:11: error: type Numeric takes type parameters
              val anotherD = arr(0).asInstanceOf[Numeric].toDouble

现在我意识到上述内容可以通过匹配/案例实现,顺序如下:

  (a, e) match {
    case (a : Double, e : Double) =>
        Math.abs(a - e) <= CompareTol
    case (a : Float, e : Float) =>
        Math.abs(a - e) <= CompareTol
    .. etc

但我想知道是否有办法更紧凑地表达操作。此代码在TEST类中,效率不是一个重要标准。具体来说:反射调用是可以的。感谢。

2 个答案:

答案 0 :(得分:5)

我假设你在JVM上。 Number类确实与您希望使用doubleValue方法实现的目标相同:

val arr = Array[Number](i,f,d)
val ds = arr.map(_.doubleValue())

答案 1 :(得分:2)

这太可怕了,probably not efficient,但它有效(在你的例子中):p

scala> import scala.language.reflectiveCalls
import scala.language.reflectiveCalls

scala> arr.map(_.asInstanceOf[{ def toDouble: Double }].toDouble)
res2: Array[Double] = Array(12345.0, 1234.5, 1234.5)