Следующий код
def httpPost[T: ClassManifest](data: AnyRef): T = {
val webResource = client.resource("http://localhost..")
val resp = webResource.post(classOf[ClientResponse], data)
resp.getEntity(classManifest[T].erasure) //Need classOf[T] here
}
приводит к ошибке компиляции этого типа
[INFO] found : _$1 where type _$1
[INFO] required: T
[INFO] resp.getEntity(classManifest[T].erasure)
На основе ответа на Scala classOf для параметра типа выглядитон должен работать.
Метод erasure возвращает java.lang.Class [_], и я предполагаю, что это проблема, поэтому у меня есть два вопроса:
- Почему класс проявляетсявозвращать экзистенциальный тип, а не просто Class [T] - если это стирание T, то оно всегда будет _ (подчеркивание), потому что T, очевидно, неизвестно, что означает, что его возвращаемое значение не так полезно, как я ожидал.
- Что мне нужно сделать, чтобы код работал!
Обновление:
Спасибо Ким и Жан-Филиппу за вашеответы.
Ранее я пробовал приведение, поэтому исходная последняя строка была заменена на
val responseData = resp.getEntity(classManifest[T].erasure) //Runtime error
responseData.asInstanceOf[T]
, и это компилируется, но теперь возникает ошибка времени выполнения, потому что методу getEntity передается класс Object, который он не может обработать, потому что этонужен более конкретный тип (для которого у него есть обработчик).Хотя он отложен до времени выполнения, он снова сводится к тому, что метод стирания не дает конкретной информации о типе, и поэтому я подумал, что для решения проблемы необходимо решить встроенный пример.