Tor*_*ben 18 java reflection scala scala-java-interop
我使用Scala的Java Reflection时遇到了问题.我的代码:
case class MyClass(id: String, value: Double)
def create(values: Map[String, Any]): MyClass = {
val constructor = classOf[MyClass].getConstructors.head
val arguments = classOf[MyClass].getDeclaredFields().map( f => values(f.getName) )
constructor.newInstance(arguments: _*).asInstanceOf[MyClass]
}
create(Map("id" -> "CE0D23A", "value" -> 828.32))
Run Code Online (Sandbox Code Playgroud)
我的问题是,我需要传递Map [String,Any],因为其中一个值是Double,但newInstance需要Object,而不是Any.
我尝试使用scalas宇宙:
case class MyClass(id: String, value: Double)
def create(values: Map[String, Any]): MyClass = {
val m = universe.runtimeMirror(getClass.getClassLoader)
val myClass = universe.typeOf[MyClass].typeSymbol.asClass
val cm = m.reflectClass(myClass)
val ctro = universe.typeOf[MyClass].declaration(universe.nme.CONSTRUCTOR).asMethod
val ctorm = cm.reflectConstructor(ctro)
ctorm(values: _*).asInstanceOf[MyClass]
}
create(Map("id" -> "CE0D23A", "value" -> 828.32))
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我只为这个例子介绍了MyClass.后来它应该是一个通用的功能def create(values: Map[String, Any]): T.但后来我得到了以下例外:"没有TypeTag可用于T"
有没有办法改变这些价值观?
谢谢
Dan*_*etz 33
java.lang.Object相当于AnyRefScala,而不是Any.这个想法是,Scala Double(大致相当于Java double)是一个Any,但不是一个AnyRef.java.lang.Double是一个AnyRef,因此也是一个Any.
您可以简单地转换为Anyto AnyRef,这将执行所需的转换以将Scala Double转换为java.lang.Double:
scala> val x = 3.5
x: Double = 3.5
scala> x.getClass
res0: Class[Double] = double
scala> val y = x.asInstanceOf[AnyRef]
y: AnyRef = 3.5
scala> y.getClass
res1: Class[_ <: AnyRef] = class java.lang.Double
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16315 次 |
| 最近记录: |