In the example below:
trait Writer[A] {
def write(a: A): String
}
case class Person(name: String, age: Int)
case class Student(name: String, roll: Int)
object DefaultStringWriters {
//here is implicit object, when to use object here?
implicit object PersonNameWriter extends Writer[Person] {
def write(person: Person) = person.name
}
//here is implicit val, when to use val here?
implicit val studentNameWriter = new Writer[Student] {
def write(student: Student) = student.name
}
}
object WriterUtil {
def stringify[A](data: A)(implicit writer: HtmlWriter[A]): String = {
writer.write(data)
}
}
#It works here with both.
WriterUtil.stringify(Person("john", "person@john.com"))
res0: String = john
WriterUtil.stringify(Person("student", "student@student.com"))
res1: String = student
When do we use implicit object or val in practical cases?