Scala classOf用于类型参数

时间:2011-06-01 11:14:35

标签: scala

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

这是我的代码:

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

我得到的错误是

  

需要类类型但是找到了

我知道在java中你不能这样做但是这在scala中是否可能?

谢谢!

2 个答案:

答案 0 :(得分:82)

由于清单 已弃用(自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);
  ...
 }
}

答案 1 :(得分:5)

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

就个人而言,我更喜欢使用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)
    ???
  }
}

免责声明:我没有编译上面的内容,但我自己的类似代码就是这样的。