2013-05-06 2 views
2

У меня есть имя класса строкового представленияScala Получение типа класса из строкового представления

val cls = Class.forName("clsName") 
def fromJson[T: Manifest](me: String): T = { 
Extraction.extract[T](net.liftweb.json.parse(me)) 
} 

Я хотел бы использовать его в качестве T: манифест т.е.

JsonConverter.fromJson[cls.type](stringData) 

это возвращает ошибку

также проверено

val t = Manifest.classType(cls) 
JsonConverter.fromJson[t](stringData) // compile error 

Каков наилучший способ? есть ли способ избежать использования рефлексии?

ответ

5

Вы могли бы попробовать что-то вроде этого:

val cls = Class.forName(myClassName) 
val m = Manifest.classType(cls) 
val myObj:Any = JsonConverter.fromJson(stringData)(m) 

Один нюанс такого подхода состоит в том, что вы должны явно ввести объект как Any. Это связано с тем, что у вас нет класса в качестве времени компиляции, и для вызова classType не указан его тип param, поэтому возвращается Manifest: Manifest[Nothing]. Не идеальный, но он работает.

+0

Сделано пару обновлений – cmbaxter

Смежные вопросы