Подтвердить что ты не робот

Scala classOf для параметра типа

Я пытаюсь создать общий метод для обновления объектов с помощью scala/java, но я не могу получить класс для параметра типа.

Вот мой код:

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

Ошибка, которую я получаю, это

требуется тип класса, но T найден

Я знаю, что в java вы не можете этого сделать, но возможно ли это в scala?

Спасибо!

4b9b3361

Ответ 1

Due Манифест устарел (так как 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);
  ...
 }
}

Ответ 2

Ответ Василя и Максима помог мне.

Лично я предпочитаю синтаксис, в котором 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)
    ???
  }
}

Отказ от ответственности: я не компилировал выше, но мой собственный аналогичный код работает таким образом.