在下面的例子中:
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
在实际情况下我们何时使用隐式对象或val?
答案 0 :(得分:1)
的差异
val
是在对象初始化期间以指定的顺序创建的。 object
是懒惰创建的。
object
创建一个新的单例类型(例如PersonNameWriter.type
)val
创建无类型(如本例所示)或结构类型。
val
可以被覆盖。 object
不能。
val
可以分配任何表达式,例如Foo()
或new Foo
。 object
必须是类定义,并且在重用代码的方式方面受到更多限制,例如extends Foo
。
如果您不关心这些差异,那么选择哪一个并不重要。在这种情况下,我建议使用val
,因为它不需要任何同步。