铸造数值在斯卡拉
问题描述:
浮法我有类似下面的泛型函数:铸造数值在斯卡拉
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指出,可以投一个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
上下文要求。
一个'Int'_can_可以转换为'Float',但是一个'java.lang.Integer'不能,并且由于某种原因,这就是'N'在尝试转换之前的情况。 – jwvh
@jwvh有趣的是,我认为演员阵容会失败。我会纠正我的答案。 –