Скала класса для параметра тип


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

вот мой код:

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

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

тип класса требуется, но нашли Т

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

спасибо!

2 66

2 ответа:

из-за Манифест и устаревший (начиная с 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)
    ???
  }
}

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