作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现一个包装数学 Java 函数的通用函数。为简单起见,我们可以假设 Java 函数 (Java 7) 接受一个参数并返回一个结果,两者都是 java.lang.Double 类型。当然,包装函数应该接受一个参数和一个结果,两者都是泛型但数字类型 A。问题是我无法在包装函数中将结果转换回类型 A。哪里/什么问题?
注意:(我是 Scala 的新手,使用以下引用来解决问题。)
package test
object mytest {
def f[A](x: A)(implicit num: Numeric[A]): A = {
val result = new java.lang.Double(num.toDouble(x))
result.asInstanceOf[A]
}
def main(args: Array[String]) {
// 'Some code'
}
}
result val result = f(3)
Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(BoxesRunTime.java:105)
at test.mytest$.main(test.scala:10)
at test.mytest.main(test.scala)
println(f(3))
3.0
println(f(3).getClass)
int
package test
object mytest {
def f[A : Manifest](x: A)(implicit num: Numeric[A]): A = {
val result = new java.lang.Double(num.toDouble(x))
manifest[A].erasure.cast(result).asInstanceOf[A]
}
def main(args: Array[String]) {
val result = f(3)
}
}
Exception in thread "main" java.lang.ClassCastException: Cannot cast java.lang.Double to int
at java.lang.Class.cast(Class.java:3176)
at test.mytest$.f(test.scala:6)
at test.mytest$.main(test.scala:10)
at test.mytest.main(test.scala)
最佳答案
你不能投 Double
至 Integer
无论如何(因为它是盒装的)。 Numeric
只允许您在 T 上进行一组数学运算(通过 import num._
) - 没有别的(您不需要一些中介类型)。 A2 工作仅因为 println 期望 Any
由于 f(3)
,所以 T
自动推断为 Any
; println(f[Int](3))
永远不会工作,f[Any](3)
将永远工作。
如果您想实现操作 Doubles 的通用函数(只有当您有特定于 Double 的操作时才需要它) - 您最好返回 Double。如果你不能 - 你将不得不通过分析 T 来手动构造类型:
def f[A](x: A)(implicit num: Numeric[A]): A = {
val result = new java.lang.Double(num.toDouble(x))
(x match {
case x: Double => result
case x: Int => result.toInt
case x: Float => result.toFloat
case x: Long => result.toLong
}).asInstanceOf[A]
}
result.doubleValue.asInstanceOf[A]
这是 A 已经装箱。
@specialized
注释不适用于
asInstanceOf
(
type A is still boxed )
@specialized
作品:
def f[@specialized(Int, Double, Long, Float) A](x: A)(implicit num: Numeric[A]): A = {
val result = new java.lang.Double(num.toDouble(x))
result.doubleValue.asInstanceOf[A]
}
classTag
/
typeTag
反而
关于Scala 转换为泛型类型(用于泛型数值函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212776/
我是一名优秀的程序员,十分优秀!