我有一个如下通用函数:
with open(foname, 'wb') as outstream:
当我用这样的Int类型调用它时:
newline
它在运行时失败。为什么我不能这样投,我该怎么做呢?
答案 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.Integer
到scala.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
证据。