2

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

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

语境:

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

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

implicit val AWrites = Json.writes[A]

implicit val AReads = Json.reads[A]
4

1 回答 1

1

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

class TypedCollection[A <: Product](name: String){}
于 2016-05-10T11:25:26.753 回答