Scala泛型:如何声明类型必须是案例类?

时间:2015-10-29 14:31:42

标签: scala generics

我有几个带count字段的案例类。默认情况下它是1,我的代码中有一个减少组的重复项,并对该值求和以查找每个对象的数量。 E.g:

case class Person(name: String, count = 1)
personList.groupBy(_.name).reduce((x,y) => x.copy(count = x.count + 1))

我在几个案例类中都有这个逻辑,因为我的逻辑比上面的例子复杂一点,我想创建一个通用的合并函数。

所以我创建了一个sealed trait字段count。然后我改变了我的case类,从而扩展了它,例如:

case class Person(name: String, override val count) extends Countable

到目前为止,非常好。

但是,我无法弄清楚如何声明我的merge函数,以便它只接受扩展Countable的案例类。因此,它无法找到copy方法。

这就是我所拥有的:

  def merge[T <: Countable](f: T => Seq[String])(ms: Seq[T]): Vector[T] = 
    ms.groupBy(x => f(x).mkString("_")).mapValues(_.reduce { (x,y) => 
     x.copy(count = x.count + 1)        // can't find `copy`
  }).values.toVector

我是否还可以包含类型类,这意味着类型使用Scala 2.11.7具有copy方法(或者是一个案例类)?

更新

Countable特质是:

sealed trait Countable {

  def timesSeen: Long = 1
}

1 个答案:

答案 0 :(得分:2)

你是如何定义可数特性的? 以下代码段对我来说很好:

  trait Countable[Z] {
    def count: Int
    def copy: Z
  }

  case class Person(name: String, override val count: Int) extends Countable[Person] {
    override def copy: Person = this
  }

  def merge[T <: Countable[T]](f: T => Seq[String])(ms: Seq[T]): Vector[T] = {
    val r = ms.groupBy(x => f(x).mkString("_")).mapValues(_.reduce { (x, y) =>
      x.copy
    }).values.toVector
    r
  }