使用asInstanceOf将Any转换为Double?

jav*_*dba 2 scala

是否有支持的方法来实现任何数字类型到double的转换.例如

   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
Run Code Online (Sandbox Code Playgroud)

当然,上面的代码不正确 - 因为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
Run Code Online (Sandbox Code Playgroud)

现在我意识到上面的内容可以通过match/case实现,顺序如下:

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

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

Gáb*_*kos 5

我假设你在JVM上.在类确实像你想实现与什么doubleValue方法:

val arr = Array[Number](i,f,d)
val ds = arr.map(_.doubleValue())
Run Code Online (Sandbox Code Playgroud)