1

继从:

Scala classOf 用于类型参数

我已经尝试过实现它,但似乎遇到了一些奇怪的泛型问题,实际上我现在已经搞砸了其中的几个,但这已经接近正确了,我可以得到它......

我正在使用 Scala - Jackson JSON 绑定(顺便说一句,优秀的库,比 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))
    }
  }
}
4

1 回答 1

3

据我记得,classManifest[T].erasure返回Class[_]而不是Class[T],所以结果jsonSerializer.readValue(...)将是 或 type Any。您可以尝试转换解析结果:

val res = jsonSerializer.readValue(s,  classManifest[T].erasure).asInstanceOf[T]
于 2012-06-15T10:29:25.207 回答