Проблема в том, что, когда вы передаете a, b, c
на Factory из PriorityQueue
.Компиляторы видят, что вы передали три аргумента типа A
, и единственный супертип между этими деревьями - Equals
.
. Это потому, что a
& b
равны Topics
, что в данном случаекласс расширяет Equals
, а c
имеет тип Seq[Topic]
(аргументы varargs передаются как Seq
) , что также расширяет Equals
.
И именно поэтому онпросит Ordering[Equals]
.
. Вы можете исправить это следующим образом.
(Обратите внимание, что это довольно уродливо и, возможно, неуместно, вы можете подумать о том, чтобы просто получить один Варарг вместо a
&b
, а затем c
)
// It will be good to have this as an implicit so you don't have to pass it explicitly
// every time you need to.
// And it is always preferable to have an implicit val with an explicit type signature
// than an implicit object.
implicit val TopicOrdering: Ordering[Topic] = new math.Ordering[Topic] {
override def compare(a: Topic, b:Topic): Int =
-(a.usageFrequency compare b.usageFrequency)
}
import scala.collection.mutable.PriorityQueue
def initPriQu(a: Topic, b: Topic, others: Topic*): PriorityQueue[Topic] =
// 1. Don't use return in scala.
// 2. Here I made a Seq of Seqs of Topic - Seq[Seq[Topic]]
// then I flatten it to have a Seq of Topic - Seq[Topic]
// and finally used the ':_*' operator to turn a Seq into a varargs.
PriorityQueue((Seq(a, b) ++ others): _*)