Scala泛型:如何声明一个类型必须是一个case类?

4

我有几个带有count字段的案例类。默认情况下为1,并且我的代码中有一个reduce函数,将重复项分组并将该值求和以找到每个对象的数量。例如:

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

我在多个案例类中都有这个逻辑,由于我的逻辑比上面的示例要复杂一些,因此我想创建一个通用的合并函数。

因此,我创建了一个带有count字段的sealed trait。然后我将我的案例类更改为扩展此类,例如:

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

目前为止一切都很好。

然而,我无法解决如何声明我的merge函数,使其仅接受继承Countable的case类。由于这个原因,它找不到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

有没有一种类型类可以包含一个类型具有copy方法(或是一个case class)的意思,在使用Scala 2.11.7时也可以包含它? 更新: Countable特质是:
sealed trait Countable {

  def timesSeen: Long = 1
}
1个回答

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
  }

你如何声明使用该特质的case类?我得到了语法错误。 - jbrown
2
不仅仅是 x.copy,而是 x.copy(count = x.count + 1)。现在我根本无法对 copy 进行参数化... - jbrown
啊,我想我明白了。 - jbrown
我有完全相同的问题,如何在可以像case类copy方法一样进行参数化的抽象类型中定义copy()方法,我仍然不知道如何做到这一点? - Uncle Long Hair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接