铸造数值在斯卡拉

问题描述:

浮法我有类似下面的泛型函数:铸造数值在斯卡拉

def foo[N: Numeric](bar: N) = bar.asInstanceOf[Float] 

当我用int型,像这样称呼它:

foo(1) //Fails, if it was a Float it would work fine though. 

无法在运行。为什么我不能像这样施放,我该如何让它工作?

我为什么不能投这样

因为N不是Float类型Int类型的和。一个明确的演员阵容仍然不会让这些类型对齐,你需要转换为另一个类型。

由于@jwvh指出,可以投一个IntFloat,反之亦然:

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上下文要求。

+0

一个'Int'_can_可以转换为'Float',但是一个'java.lang.Integer'不能,并且由于某种原因,这就是'N'在尝试转换之前的情况。 – jwvh

+0

@jwvh有趣的是,我认为演员阵容会失败。我会纠正我的答案。 –