1

我正在使用杰克逊在 scala 中编写一个 kafka json 反序列化器,但是在为杰克逊的readValue()方法提供泛型类型的类时遇到问题。例如:

...
import org.apache.kafka.common.serialization.Deserializer

class JsonDeserializer[T] extends Deserializer[Option[T]] {

  val mapper = (new ObjectMapper() with ScalaObjectMapper)
    .registerModule(DefaultScalaModule)
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    .registerModule(new JavaTimeModule())
    .findAndRegisterModules()
    .asInstanceOf[ObjectMapper with ScalaObjectMapper]

  def deserialize(topic: String, bytes: Array[Byte]): Option[T] = {
    Option(bytes) match {
      case Some(b) => Some(mapper.readValue(bytes, classOf[T]))
      case None => None
    }

  }

  def configure(configs: java.util.Map[String, _], isKey: Boolean) {}
  def close(): Unit = {}
}

注意方法mapper.readValue(bytes, classOf[T])中的deserialize。编译失败,出现“需要类类型但找到 T”。

如何才能做到这一点?

4

1 回答 1

4

Java 中的泛型类型在运行时被擦除,因此如果Class不显式传递它就无法恢复。

好吧,就Java而言,这是明确的。您可以使用 an(implicit ct: ClassTag[T])或简写[T: ClassTag]来(隐式地)ClassTag在构造时获取 a,这允许您Class稍后检索。

import scala.reflect._

class JsonDeserializer[T: ClassTag] extends Deserializer[Option[T]] {
  ...
    mapper.readValue(bytes, classTag[T].runtimeClass.asInstanceOf[Class[T]])
于 2017-07-21T06:38:18.653 回答