2017-07-19 75 views
1

浮法我有類似下面的泛型函數:鑄造數值在斯卡拉

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

當我用int型,像這樣稱呼它:

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

無法在運行。爲什麼我不能像這樣施放,我該如何讓它工作?

回答

2

我爲什麼不能投這樣

因爲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有趣的是,我認爲演員陣容會失敗。我會糾正我的答案。 –