Почему я получаю ошибку "расходящегося неявного расширения" при попытке отсортировать экземпляры упорядоченного класса?
Есть много вопросов на эту тему, но после часа чтения я все еще не могу понять, что я делаю неправильно. Вот минимальный пример кода, который у меня есть (Scala 2.11):
object Anomalies {
sealed abstract class AnomalyType(val priority: Int)
extends Ordered[AnomalyType] {
override def compare(that: AnomalyType): Int =
this.priority - that.priority
def name = toString()
}
case object CRITICAL extends AnomalyType(0)
case object SERIOUS extends AnomalyType(1)
case object WARN extends AnomalyType(2)
}
Когда я пробую базовое сравнение, оно работает нормально:
scala> Anomalies.CRITICAL < Anomalies.WARN
res17: Boolean = true
Тем не менее, при попытке упорядочить список компилятор на меня кричит:
scala> Seq(Anomalies.CRITICAL, Anomalies.WARN).max
<console>:26: error: diverging implicit expansion for type
Ordering[Anomalies.AnomalyType with Product with Serializable]
starting with method $conforms in object Predef
Seq(Anomalies.CRITICAL, Anomalies.WARN).max
РЕДАКТИРОВАТЬ: Благодаря Dmytro Mitin я теперь знаю, что Seq[Anomalies.AnomalyType](Anomalies.CRITICAL, Anomalies.WARN).max
а также Seq(Anomalies.CRITICAL, Anomalies.WARN).max[Anomalies.AnomalyType]
работают.
Может кто-нибудь помочь мне понять ошибку и почему указание типа исправляет ее? Есть ли способ не указывать это явно?
2 ответа
Предполагаемый тип для вашей последовательности: Seq[Anomalies.AnomalyType with Product with Serializable]
, Проверьте это сообщение в блоге о Product with Serializable
за то, что происходит и как это исправить.
Для этого достаточно указать параметр типа:
Seq[Anomalies.AnomalyType](Anomalies.CRITICAL, Anomalies.WARN).max // WARN
или же
Seq(Anomalies.CRITICAL, Anomalies.WARN).max[Anomalies.AnomalyType] // WARN