【问题标题】:Scala Define a generic class that only accepts case classesScala 定义一个只接受case类的泛型类
【发布时间】:2016-05-10 19:25:26
【问题描述】:

在 Scala 中定义泛型类时,如何确保类型参数“A”必须是案例类?

class TypedCollection[A](name: String){}

上下文:

我正在尝试定义一个通用的“TypedCollection”包装类来与 reactivemongo JSONCollection 进行交互,就好像它是一个案例类的集合(类似于关系数据库的 Typesafe Slick)。

'A' 必须是一个案例类的原因是它会自动被赋予一个'unapply' 方法。在创建类型“A”到 JsObject 或 BSONObject 的隐式转换时,在泛型类中使用此方法,以便可以将其存储在 MongoDB 中。即

implicit val AWrites = Json.writes[A]

implicit val AReads = Json.reads[A]

【问题讨论】:

  • 看不到目标...为什么不检查那里A : OWrites,或A : OFormat(或A : BSONDocument{Reader,Writer})?

标签: scala reactivemongo play-reactivemongo scala-generics


【解决方案1】:

所有案例类(以及元组)最具体的直接祖先是Product。在 scaladoc 中没有直接提到它总是为他的后代提供带有 unapply 的伴随对象,但实际上所有子类(案例类和元组)都遵循这个约定。因此,您可以像这样定义类型参数的绑定:

class TypedCollection[A <: Product](name: String){}

【讨论】:

  • 你将如何导入产品,因为 Scala 似乎不知道它?
猜你喜欢
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多