【问题标题】:Converting unknown classTag to Float in Scala在Scala中将未知的classTag转换为Float
【发布时间】:2019-05-05 11:53:36
【问题描述】:

我有一个名为data 的变量。此数据的类型为Array[ED]。现在在运行时,ED 的类型可以是IntegerDouble。我想将此数组转换为Array[Float] 的数组。我已经尝试过data.map(x => x.asInstanceOf[Float].floatValue),但不幸的是,它返回了 ClassCastException 异常。我想知道转换这个数组的正确方法是什么?

【问题讨论】:

  • ED 是如何定义的? (是类型同义词、特征、类等吗?)
  • 正在尝试从Double 转换为Float

标签: arrays scala casting type-conversion


【解决方案1】:

任何Numeric 值都可以转换为Float 值。

def toFloat[N](n :N)(implicit ev :Numeric[N]) :Float =
  ev.toDouble(n).floatValue()

toFloat(9)     //res0: Float = 9.0
toFloat(9.2D)  //res1: Float = 9.2

但如果编译器无法将您的 ED 类型识别为 Numeric,那么这将无济于事。

【讨论】:

    【解决方案2】:

    您可以使用collect 获取Array 中的值:

    data.collect{ case n: Number => n.floatValue }
    

    这将跳过任何非数字值,因此如果您想检查这一点,请添加 case _

    我还建议使用原生 Scala 类型,例如 ListVector,而不是 Array,后者只是 Java 数组的包装器,不太适合 Scala 类型系统。


    请注意,Number 相当笨拙,因为它是一种 Java 类型,实际上并不在 Scala 类型层次结构中。如果你想避免它,这也有效:

    data.map(_.toString.toFloat)
    

    【讨论】:

      【解决方案3】:

      您可以将此未知类型转换为 Number,因为 Number 是所有数字类的超类。

        def convertToFloat[T](arr: Array[T]): Array[Float] = {
          arr.map(_.asInstanceOf[Number].floatValue())
        }
      
        def main(args: Array[String]): Unit = {
          println(convertToFloat(Array(1.234456335664756746, 2.324902485349859)).mkString(", "))
          println(convertToFloat(Array(1, 2, 3)).mkString(", "))
        }
      

      输出是:

      1.2344563、2.3249025

      1.0、2.0、3.0

      【讨论】:

      • Number 实际上不是IntFloat 的超类,但是有足够的自动转换来完成这项工作。
      猜你喜欢
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2015-08-30
      • 2014-07-24
      相关资源
      最近更新 更多