Scala定义仅接受案例类的泛型类

时间:2016-05-10 11:09:17

标签: scala reactivemongo play-reactivemongo scala-generics

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

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

上下文:

我试图定义一个通用的' TypedCollection' wrapper类用于交互响应式JSONCollection,就好像它是一个case类的集合(类似于关系数据库的Typesafe Slick)。

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

implicit val AWrites = Json.writes[A]

implicit val AReads = Json.reads[A]

1 个答案:

答案 0 :(得分:1)

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

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