Scala classOf用于类型参数,重新访问

时间:2012-06-15 09:53:26

标签: scala types manifest type-erasure

继续之后:

Scala classOf for type parameter

我已经尝试过实现它,但似乎得到了一些奇怪的泛型问题,实际上我现在已经把它们弄得一团糟了,但这很接近正确我可以得到它......

我正在使用Scala - Jackson 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))
  }
}

无论如何,上面的代码产生了以下编译错误:

  

类型不匹配;发现:res.type(底层类型为Any)需要:T

我很困惑。上面的代码应该可以工作吗?

更新 根据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))
    }
  }
}

1 个答案:

答案 0 :(得分:3)

据我记忆,classManifest[T].erasure会返回Class[_]而不是Class[T],因此jsonSerializer.readValue(...)的结果将是Anyval res = jsonSerializer.readValue(s, classManifest[T].erasure).asInstanceOf[T] 。您可以尝试转换解析结果:

{{1}}