扩展类型类
此示例讨论扩展下面的类型类。
trait Show[A] {
def show: String
}
要创建一个你控制的类 (并使用 Scala 编写),请扩展类型类,向其伴随对象添加隐式。让我们展示如何从这个例子中获取 Person
类来扩展 Show
:
class Person(val fullName: String) {
def this(firstName: String, lastName: String) = this(s"$firstName $lastName")
}
我们可以通过向 Person
的伴随对象添加一个隐式来使这个类扩展 Show
:
object Person {
implicit val personShow: Show[Person] = new Show {
def show(p: Person): String = s"Person(${p.fullname})"
}
}
伴随对象必须与该文件位于同一文件中,因此你需要在同一文件中同时使用 class Person
和 object Person
。
要创建一个你不控制或不用Scala 编写的类,请扩展类型类,向类型类的伴随对象添加一个隐式,如 Simple Type Class 示例所示。
如果你既不控制类也不控制类型类,那么在任何地方创建一个隐含的,并且 import
它。在 Simple Type Class 示例中使用 log
方法 :
object MyShow {
implicit val personShow: Show[Person] = new Show {
def show(p: Person): String = s"Person(${p.fullname})"
}
}
def logPeople(persons: Person*): Unit = {
import MyShow.personShow
persons foreach { p => log(p) }
}