我想做一个泛型函数,能够通过一个共同的“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类),将是完美的。
答案 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)
事实上,我可以想出许多其他方法来实现同样的结果。枚举太多了。如果您能说明其他一些要求,我可以找到更合适的解决方案。