2012-06-15 6 views
1

Вслед за:Scala classOf для параметра типа, повторно

Scala classOf for type parameter

Я попытался его реализации, но, кажется, чтобы получить некоторые странные проблемы генериков, на самом деле я запутался свой путь через пару из них сейчас, но это так близко, чтобы исправить я могу получить его ...

Я использую Scala - привязок Джексон JSON (отличный LIB, кстати, гораздо проще, чем SJson)

def genparseResult[T: ClassManifest](t: T,s:String):Either[Tuple2[JsonParseException,String],T] = { 
    try{ 
    val res = jsonSerializer.readValue(s, classManifest[T].erasure) 
    Right(res) 
    } 
    catch{ 
    case jpe:JsonParseException => Left((jpe,s)) 
    } 
} 

Во всяком случае, приведенный выше код генерирует следующую ошибку компиляции:

type mismatch; found : res.type (with underlying type Any) required: T

Я запутался, как ад. Должен ли приведенный выше код работать?

Update следующий вход от Tenshi, я отправляю Весь класс

import com.fasterxml.jackson.core.JsonParseException 
object DatasiftJsonMapper { 
    import java.util.Date 
    import com.fasterxml.jackson.databind.{ Module, ObjectMapper } 
    import com.fasterxml.jackson.module.scala.DefaultScalaModule 

    val jsonSerializer = { 
    val m = new ObjectMapper() 
    m.registerModule(DefaultScalaModule) 
    m 
    } 

    def parseDSResult(s: String): Either[Tuple2[JsonParseException, String], DatasiftResult] = { 
    genparseResult(classOf[DatasiftResult], s) 
    } 

    def parseQRegRequest(s: String): Either[Tuple2[JsonParseException, String], QRegRequest] = { 
    genparseResult(classOf[QRegRequest], s) 
    } 

    def genparseResult[T: ClassManifest](t: Class[T], s: String): Either[Tuple2[JsonParseException, String], T] = { 
    try { 
     val res = jsonSerializer.readValue(s, classManifest[T].erasure).asInstanceOf[T] 
     Right(res) 
    } catch { 
     case jpe: JsonParseException => Left((jpe, s)) 
    } 
    } 
} 

ответ

3

Насколько я помню, classManifest[T].erasure возвращается Class[_] вместо Class[T], поэтому результат jsonSerializer.readValue(...) бы быть или типа Any , Вы можете попытаться лишить результат разбора:

val res = jsonSerializer.readValue(s, classManifest[T].erasure).asInstanceOf[T] 
+0

На деньги десятки –

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