2015-12-07 8 views
0

Я не могу сделать эту работу:Пользовательская сортировка в Скале

abstract class AlternativeSortingType[T, B](implicit val ord: scala.math.Ordering[B]) { 
    def convert(t: T): B 
} 

case class LengthSortingType() extends AlternativeSortingType[String, Int] { 
    def convert(t: String): Int = t.length 
} 

class ProduceResult { 
    var c: AlternativeSortingType[String, _] = LengthSortingType() 
    def sort(l: List[String]) = l.sortBy(c.convert(_))(c.ord) 
} 

Он сетует следующий:

<console>:20: error: type mismatch; 
found : scala.math.Ordering[_$1] 
required: scala.math.Ordering[Any] 
Note: _$1 <: Any, but trait Ordering is invariant in type T. 
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10) 
      def sort(l: List[String]) = l.sortBy(c.convert(_))(c.ord) 
                   ^

я уже пытался поставить тип B только метод, но я не» Посмотрите, как избавиться от wilcard. Я хочу, чтобы иметь возможность сортировать, указав любой конвертер.

Как сделать тип совпадением?

+0

Это будет работать '' 'класс ProduceResult { вал с = IntSortingType Защиту сортировки (л: Список [String]) = l.sortBy (c.convert (_)) (c.ord) } '' ' – mfirry

+0

Да, но я хотел бы иметь c generic, чтобы впоследствии его заменить (думает о том, что метод сортировки по умолчанию и позволить пользователю реализовать его собственный) –

ответ

0

Я нашел обходное решение, в котором я могу даже сейчас составить состав заказов.

abstract class AlternativeSortingType[T] extends Ordering[T] { self => 
    def &&(other: AlternativeSortingType[T]): AlternativeSortingType[T] = new AlternativeSortingType[T] { 
    def compare(e: T, f: T): Int = { 
     val ce = self.compare(e, f) 
     if(ce == 0) other.compare(e, f) else ce 
    } 
    } 
} 

case class LengthSortingType() extends AlternativeSortingType[String] { 
    def compare(e: String, f: String): Int = e.length - f.length 
} 

case class DictionarySortingType() extends AlternativeSortingType[String] { 
    def compare(e: String, f: String): Int = if(e < f) -1 else if(e==f) 0 else 1 
} 

class ProduceResult { 
    var c: AlternativeSortingType[String] = LengthSortingType() && DictionarySortingType() 
    def sort(l: List[String]) = l.sortWith((e,f) => c.compare(e, f) < 0) 
} 
Смежные вопросы