Scala classOf用于类型参数

mer*_*no1 77 scala

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

这是我的代码:

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

我得到的错误是

需要类类型但是找到了T.

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

谢谢!

Vas*_*iuk 88

Due Manifest弃用(自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)
    ???
  }
}
Run Code Online (Sandbox Code Playgroud)

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

原始答案 - 是的,您可以使用清单来做到这一点:

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

  • @mericano1一个更新:`Manifest`和`ClassManifest`现在已被弃用,在Scala 2.10上分别被`TypeTag`和`ClassTag`取代. (12认同)
  • 而不是`classTag [T] .runtimeClass`我需要`classTag [T] .runtimeClass.asInstanceOf [Class [T]]`.有人知道为什么吗? (8认同)

aka*_*ppi 6

Vasil和Maxim的回答对我有所帮助。

就我个人而言,我更喜欢在其中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)
    ???
  }
}
Run Code Online (Sandbox Code Playgroud)

免责声明:我没有编译上面的内容,但是我自己的类似代码以这种方式工作。