Scala:具有嵌套案例类的通用函数

时间:2015-12-08 20:21:00

标签: scala generics shapeless

我想做一个泛型函数,能够通过一个共同的“sub”参数对不同的嵌套case类进行排序。

目前我已经这样做了:

 sealed trait SortableByGeoPoint {
    val geographicPoint: Int
  }
  case class A(id: Int, geographicPoint: Int) extends SortableByGeoPoint
  case class B(image: String, geographicPoint: Int) extends SortableByGeoPoint

  case class C(a: A, other: String)
  case class D(b: B, other: Int)

  def sortByGeoPoint(sequence: Seq[SortableByGeoPoint]): Seq[SortableByGeoPoint] = sequence.sortBy(_.geographicPoint)

它可以很好地对A类或B类的序列进行排序,但我想让它适用于案例类C或D(包含SortableByGeoPoint子类)如何实现这一目标?

我看了一下无形但没有办法做到这一点,但任何方法(知道我将稍后添加其他类,如C或D类),将是完美的。

1 个答案:

答案 0 :(得分:4)

我认为你缺少某种形式的类型约束。使代码编译的最直接方法是:

case class C(a: A, other: String) extends SortableByGeoPoint {
  val geographicPoint: Int = a.geographicPoint
}
case class D(b: B, other: Int) extends SortableByGeoPoint {
  val geographicPoint: Int = b.geographicPoint
}

这可能符合您的要求。那么,让我们再做一个:

case class Z[T](b: SortableByGeoPoint, other: T)
def sortByGeoPoint2(sequence: Seq[Z]): Seq[Z] = sequence.sortBy(_.b.geographicPoint)

事实上,我可以想出许多其他方法来实现同样的结果。枚举太多了。如果您能说明其他一些要求,我可以找到更合适的解决方案。