类型参数的类

我正在尝试使用 scala/java 创建一个用于对象更新的通用方法,但是我无法获得类型参数的类。

这是我的代码:

object WorkUnitController extends Controller {
def updateObject[T](toUpdate: T, body: JsonObject){
val source = gson.fromJson(body, classOf[T]);
...
}
}

我得到的错误是

需要的类类型,但找到了 T

我知道在 java 中你做不到,但是在 scala 中这可能吗?

谢谢!

25853 次浏览

由于 旅客名单不赞成(因为 Scala 2.10.0) ,这是更新的答案-

import scala.reflect.ClassTag
import scala.reflect._


object WorkUnitController extends Controller {
def updateObject[T: ClassTag](toUpdate: T, body: JsonObject){
val source = gson.fromJson(body, classTag[T].runtimeClass)
???
}
}

您应该使用 ClassTag而不是 ClassManifest.runtimeClass而不是 .erasure

原始答案- 是的,你可以使用清单:

object WorkUnitController extends Controller {
def updateObject[T: ClassManifest](toUpdate: T, body: JsonObject){
val source = gson.fromJson(body, classManifest[T].erasure);
...
}
}

瓦西里和马克西姆的回答帮助了我。

就个人而言,我更喜欢使用 implicit来添加这些参数的语法(目前的 : ClassTag是它的简写)。因此,在这里,如果有人也看到这是一个更好的方式:

import scala.reflect.ClassTag


object WorkUnitController extends Controller {
def updateObject[T](toUpdate: T, body: JsonObject)(implicit tag: ClassTag[T]){
val source = gson.fromJson(body, tag.runtimeClass)
???
}
}

演示: https://scastie.scala-lang.org/Vij5rpHNRDCPPG1WHo566g