jackson 如何在Scala中获取classOf[Array[T]]

m3eecexj  于 2022-11-08  发布在  Scala
关注(0)|答案(1)|浏览(152)

我有一个方法(scala 2.12),看起来像下面这样。
目标是从objectMapper(Jackson)向方法readValue传递一个字符串和一个需要转换该字符串的类,在本例中是一个Array[T]。
T可以是两个不同的case类,所以这就是为什么我试图参数化它的原因。

private def fromSeqToCastedSeq[T](files: Seq[File]): Seq[T] = {
files flatMap (file => {
  val maps = objectMapper.readValue(file, classOf[Map[String, Any]])
  val combinedString = objectMapper.writeValueAsString(maps.get("sqlDefinitions"))
  val o = objectMapper.readValue(combinedString, classOf[Array[T]])
  o})

目前它不能用scala.MatchError编译,因为它不能在运行时强制转换。
有人能帮我理解我正在努力实现的目标是否可能吗?

  • 谢谢-谢谢
yebdmbv4

yebdmbv41#

正如在Discord中所回答的,您应该能够做到这一点:

import scala.reflect.ClassTag

private def fromSeqToCastedSeq[T](files: Seq[File])(implicit ct: ClassTag[T]): Seq[T] = {
  val arrayTClass = ct.wrap.runtimeClass.asInstanceOf[Class[Array[T]]]

  files.flatMap { file =>
    val maps = objectMapper.readValue(file, classOf[Map[String, Any]])
    val combinedString = objectMapper.writeValueAsString(maps.get("sqlDefinitions"))
    objectMapper.readValue(combinedString, arrayTClass)
  }
}

现在,不知道这是否会在运行时崩溃,很可能是因为这段代码非常不安全和不符合规范。

相关问题