Scala 中的 List 中的泛型类型



我有以下代码片段:

val serializedClasses: List[MongoMetaRecord[MongoRecord[_]]] = List(User, Email)

不幸的是,我无法从元素中获取确切的类型信息,并且以下代码失败:

serializedClasses.map(c => new RecordSerializer(c))
[error] JsonFormats.scala:19: inferred type arguments [_$1] do not conform to class RecordSerializer's type parameter bounds [T <: net.liftweb.mongodb.record.MongoRecord[T]]
[error]   implicit val jsonformats = DefaultFormats + (new ObjectIdSerializer)  + (new RecordSerializer(DirectMessage)) + (new RecordSerializer(User)) ++ serializedClasses.map(c => new RecordSerializer(c))

这是RecordSerializer.scala

object RecordSerializer {
  def apply[T <: MongoRecord[T]](meta: MongoMetaRecord[T]) = new RecordSerializer(meta)
}
class RecordSerializer[T <: MongoRecord[T]](meta: MongoMetaRecord[T]) extends Serializer[MongoRecord[T]] {
  def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), MongoRecord[T]] = {
case (TypeInfo(clazz, parametrizedType), json: JValue) if(JsonFormats.serializedClassesNames.contains(clazz.getSimpleName)) => {
  meta.fromJValue(json).openOr(throw new MappingException("Couldn't convert"))
    }
  }
  def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
    case rec: MongoRecord[_] => rec.asJValue
  }
}

我不清楚这里的问题是什么。 如何让它编译? RecordSerializer 采用键入的 MongoRecord,而您的 List 不会捕获其项的类型。 如果要使其正常工作,则需要捕获记录类型(可以使用 Shapeless 提供的 HList 来捕获每个项的类型),或者需要重写 RecordSerializer,以便它仅在运行时从记录中获取其类型信息,而不依赖于了解编译时类型。

相关内容

  • 没有找到相关文章

最新更新