Как я могу решить неявное расширение расходящихся для типа

Я хочу сделать мой случай класса Event[K, V] по приказу ключа K всегда. Но мне нужно уметь сравнивать события разных ценностей V, Как я могу решить это расходящееся неявное расширение?

import scala.math.Ordering

object Event {
  case class Event[K, V](key: K, value: V)
    (implicit o: Ordering[K]) extends Ordered[Event[K, _]] {
      override def compare(that: Event[K, _]): Int = o.compare(key, that.key)
    }
}

object Main extends App {
  // mimicking a librarys function 
  def lala[O](e: O)(implicit ordering: Ordering[O]) = ???

  val b = Event.Event("a", 12) <= Event.Event("a", 11.99)    
  lala(Event.Event("a", 12))
}

Призыв к lala не компилируется из-за этого расходящегося неявного расширения

diverging implicit expansion for type   
scala.math.Ordering[Event.Event[String,Int]] starting with method $conforms 
in object Predef lala(Event.Event("a", 12))

1 ответ

Решение

Если ваш библиотечный метод ожидает Ordering Например, для вашего типа вы должны предоставить Ordered, что совершенно неубедительно с точки зрения компилятора. Вместо этого попробуйте следующее:

case class Event[K, V](key: K, value: V)

object Event {
  implicit def eventOrdering[K, V](implicit o: Ordering[K]) =
    new Ordering[Event[K, V]] {
      // ...
    }
}
Другие вопросы по тегам