2015-12-08 3 views
2

Я хотел бы сделать универсальную функцию, способную сортировать различные вложенные классы case одним из своих общих аргументов.Scala: общая функция с вложенными классами ячеек

На данный момент я сделал это:

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) 

Он хорошо работает, чтобы отсортировать последовательность класса А или класса B, но я хотел бы, чтобы заставить его работать на случай класса С или D (которые содержат подкласс класса SortableByGeoPoint) Как я могу это сделать?

Я взглянул на бесформенность, но не нашел способ сделать это, но любой способ сделать это (зная, что я добавлю другие классы, такие как класс C или D), будет идеальным.

ответ

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) 

Фактически, я могу думать о многих других способах достижения такого же результата. Слишком много, чтобы перечислить. Если вы можете проиллюстрировать несколько других требований, я мог бы найти более подходящее решение.

Смежные вопросы