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?
Спасибо!
Ответы
Ответ 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)
???
}
}
Отказ от ответственности: я не компилировал выше, но мой собственный аналогичный код работает таким образом.