2016-05-10 6 views
2

При определении общего класса в Scala, как я могу гарантировать, что параметр типа «A» должен быть классом case?Scala Определите общий класс, который принимает только классы case

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

Контекст:

Я пытаюсь определить общий класс «TypedCollection» обертки, чтобы взаимодействовать с reactivemongo JSONCollection, как если бы это был сборник тематических классов (по аналогии с типизированным Slick для реляционных баз данных).

Причина «A» должна быть классом case, поэтому ему автоматически будет присвоен метод «unapply». Этот метод используется в родовом классе при создании неявных преобразований для типа «А» в JsObject или BSONObject, чтобы он мог храниться в MongoDB. т.е.

implicit val AWrites = Json.writes[A] 

implicit val AReads = Json.reads[A] 
+3

Не видеть цель ... почему бы не проверить есть 'A: OWrites', или' A: OFormat' (или 'A: BSONDocument {Reader, Writer} ')? – cchantep

ответ

1

Самым конкретным прямым предком всех классов случае (а также кортежей) является продукта. Он не упоминается непосредственно в scaladoc, что он всегда предоставляет объект-компаньон с unapply для своего потомка, но на практике все подклассы (классы case и кортежи) следуют этому соглашению. Таким образом, вы можете определить ограничение на вас параметра типа, как это:

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

Как бы вы импортировали продукт, потому что Scala, похоже, не знает его? – Sparky

 Смежные вопросы

  • Нет связанных вопросов^_^