在Scala中将数值转换为浮点数

时间:2017-07-19 06:42:28

标签: scala generics casting

我有一个如下通用函数:

with open(foname, 'wb') as outstream:

当我用这样的Int类型调用它时:

newline

它在运行时失败。为什么我不能这样投,我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

  

为什么我不能像这样投出

因为N属于Int类型而非类型Float。显式强制转换仍然不会使这些类型对齐,您需要一种类型转换为另一种类型。

正如@jwvh指出的那样,可以将Int投射到Float,反之亦然:

scala> (1.0).asInstanceOf[Int]
res14: Int = 1

scala> (1).asInstanceOf[Float]
res15: Float = 1.0

但是从java.lang.Integerscala.Float的转换将失败:

scala> Integer.valueOf(1).asInstanceOf[Float]
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float
  at scala.runtime.BoxesRunTime.unboxToFloat(BoxesRunTime.java:109)
  ... 29 elided

由于装箱/拆箱(仍然使用Numeric的属性来完成此任务会更安全。)

  

如何让它发挥作用?

Numeric有一堆toX方法。您正在寻找toFloat

def foo[N: Numeric](bar: N) = implicitly[Numeric[N]].toFloat(bar)

产量

scala> foo(1)
res10: Float = 1.0

注意implicitly用于召唤您在Numeric[N]上绑定的上下文所需的隐式N证据。