【问题标题】:Scala classOf for type parameter, revisitedScala classOf 用于类型参数,重新访问
【发布时间】:2012-06-15 09:53:26
【问题描述】:

接下来是:

Scala classOf for type parameter

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

我正在使用 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

我一头雾水。上面的代码应该可以工作吗?

更新 根据天师的意见,我发布完成的课程

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))
    }
  }
}

【问题讨论】:

    标签: scala types manifest type-erasure


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多