This is a usage example FullTypeHints.
Validable[Field], ( , . ), JSON4S.
: Validable[Field] Contact[Field: Validable] implicit validable: Validable[Field].
validable: Validable[Field] Contact ( ) validable, (, Mail), Contact .
trait Validable[T]{
def valid(field: T): Boolean
}
abstract class Contact[Field](
val field: Field, val created: Long,
val updated: Long, val note: String) {
val validable: Validable[Field]
}
object Contacts{ val classList = List(classOf[Mail]) }
case class Mail(
override val field: String,
override val created: Long = System.currentTimeMillis(),
override val updated: Long = System.currentTimeMillis(),
override val note: String
) extends Contact[String](field, created, updated, note){
override val validable: Validable[String] = Mail
}
case object Mail extends Validable[String] {
override def valid(field: String): Boolean = true
}
implicit val formats = DefaultFormats + FullTypeHints(Contacts.classList)
val mail: List[Mail] = List(Mail(field = "random@mail.com", note = "Random note."))
val serialized = Serialization.write(mail)
val mailS = Serialization.read[List[Contact[_]]](serialized)
print(mail == mailS)
serialized JSON :
[
{
"jsonClass":"whatever.core.entities.utility.contact$Mail",
"field":"random@mail.com",
"created":1509098018776,
"updated":1509098018776,
"note":"Random note."
}
]