Почему я получаю ошибку "расходящегося неявного расширения" при попытке отсортировать экземпляры упорядоченного класса?

Есть много вопросов на эту тему, но после часа чтения я все еще не могу понять, что я делаю неправильно. Вот минимальный пример кода, который у меня есть (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
Другие вопросы по тегам