我有一个带有可变数量参数的函数。第一个是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
有办法做到这一点吗? (该功能需要添加所有数字)。
答案 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