Scala Определите универсальный класс, который принимает только классы дел
Как определить универсальный класс в Scala, как я могу убедиться, что параметр типа 'A' должен быть классом case?
class TypedCollection[A](name: String){}
Контекст:
Я пытаюсь определить универсальный класс-обертку TypedCollection для взаимодействия с JSONCollection реагирующего на мононизм, как если бы это был набор классов дел (аналогично Typesafe Slick для реляционных баз данных).
Причина 'A' должна быть классом case, поэтому ему будет автоматически предоставлен метод 'unapply'. Этот метод используется в универсальном классе при создании неявных преобразований для типа "A" в JsObject или BSONObject, поэтому он может храниться в MongoDB. т.е.
implicit val AWrites = Json.writes[A]
implicit val AReads = Json.reads[A]
1 ответ
Наиболее конкретным прямым предком всех классов case (а также кортежей) является Product. Непосредственно в scaladoc не упоминается, что он всегда предоставляет объект-компаньон unapply для своего потомка, но на практике все подклассы (case-классы и кортежи) следуют этому соглашению. Итак, вы можете определить привязанный к вам параметр типа следующим образом:
class TypedCollection[A <: Product](name: String){}