Scala:具有嵌套大小写的通用函数 类

Scala: generic function with nested case classes

我想做一个通用函数,能够根据它们的一个共同的 "sub" 参数对不同的嵌套案例 class 进行排序。

目前我这样做了:

 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)

对 class A 或 class B 的序列排序效果很好,但我想让它对 class C 或 class C 或D(包含一个 SortableByGeoPoint 子class)我怎样才能完成这个?

我看了看 shapeless 但没有找到方法来做到这一点,但是有任何方法可以做到(知道我稍后会添加其他 classes,比如 class C或 D),将是完美的。

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

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)

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