1
浮法我有類似下面的泛型函數:鑄造數值在斯卡拉
def foo[N: Numeric](bar: N) = bar.asInstanceOf[Float]
當我用int型,像這樣稱呼它:
foo(1) //Fails, if it was a Float it would work fine though.
無法在運行。爲什麼我不能像這樣施放,我該如何讓它工作?
浮法我有類似下面的泛型函數:鑄造數值在斯卡拉
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有趣的是,我認爲演員陣容會失敗。我會糾正我的答案。 –