使用asInstanceOf将Any转换为Double

时间:2013-12-19 20:48:18

标签: scala

我有一个带有可变数量参数的函数。第一个是String,其余是数字(Int或Double),所以我使用Any *来获取参数。我想将数字统一地视为双打,但我不能在数字参数上使用asInstanceOf [Double]。例如:

 val arr = Array("varargs list of numbers", 3, 4.2, 5)
 val d = arr(1).asInstanceOf[Double]

给出:

 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double

有办法做到这一点吗? (该功能需要添加所有数字)。

4 个答案:

答案 0 :(得分:4)

Scala的asInstanceOf是其铸造的名称。铸造没有转变。

你想要的就是这样:

val mongrel = List("comment", 1, 4.0f, 9.00d)
val nums = mongrel collect { case i: Int => i case f: Float => f case d: Double => d }
val sumOfNums = nums.foldLeft(0.0) ((sum, num) => sum + num)

答案 1 :(得分:3)

以下是Randall答案的略微简化:

val mongrel = List("comment", 1, 4.0f, 9.00d)
val nums = mongrel collect { case i: java.lang.Number => i.doubleValue() }
val sumOfNums = nums.sum

在Scala中匹配任何类型的数字都有点棘手,请参阅here了解其他方法。

答案 2 :(得分:2)

当需要处理不同类型时,应避免使用它们,而是使用模式匹配。要添加数组的所有Double和Int,您可以使用:

val array = Array("varargs list of numbers", 3, 4.2, 5)

array.foldLeft(0.0){ 
  case (s, i: Int) => s + i
  case (s, d: Double) => s + d
  case (s, _) => s
}

模式匹配允许您分别处理每种不同类型,并避免遇到ClassCastExceptions

答案 3 :(得分:1)

稍微退一步,让函数更轻松地取代Double*代替Any*

scala> def foo(str: String, nums: Double*) { 
    nums foreach { n => println(s"num: $n, class:   ${n.getClass}") } 
}
foo: (str: String, nums: Double*)Unit

scala> foo("", 1, 2.3)
num: 1.0, class: double
num: 2.3, class: double