扩展类型类

此示例讨论扩展下面的类型类。

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 Personobject 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) }
}