Скала класса для параметра тип
Я пытаюсь создать универсальный метод для обновления объектов с помощью scala / java, но я не могу получить класс для параметра типа.
вот мой код:
object WorkUnitController extends Controller {
def updateObject[T](toUpdate: T, body: JsonObject){
val source = gson.fromJson(body, classOf[T]);
...
}
}
ошибка, которую я получаю
тип класса требуется, но нашли Т
Я знаю, что в java вы не можете этого сделать, но возможно ли это вообще в scala?
спасибо!
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) ??? } }
отказ от ответственности: я не компилировал выше, но мой собственный подобный код работает таким образом.