Черта Ordered
принимает параметр. Параметр типа предоставлен, но он работает так же, как и любой другой параметр. Когда вы расширяете его дважды, в базовом классе и в подклассе, вы не «импортируете» две версии Ordered
. Вместо этого происходит линеаризация классов, и вы импортируете ее только один раз. По этой причине вы не можете передать ему два разных параметра.
Теперь есть причина, по которой TreeMap
не требует subclass
из Ordered
, просто преобразование из вашего класса в Ordered
. Именно для того, чтобы сделать такие вещи возможными. Вместо того, чтобы расширять эти вещи напрямую, вы должны указывать на них:
scala> class A(val x: Int)
defined class A
scala> class B(x : Int, val y : Int) extends A(x)
defined class B
scala> import scala.collection.immutable.TreeMap
import scala.collection.immutable.TreeMap
scala> class AOrd(a: A) extends Ordered[A] {
| def compare(that: A) = a.x.compare(that.x)
| }
defined class AOrd
scala> object AOrd {
| implicit def toAOrd(a: A) = new AOrd(a)
| }
defined module AOrd
scala> class BOrd(b: B) extends Ordered[B] {
| def compare(that: B) = b.x.compare(that.x) match {
| case 0 => b.y.compare(that.y)
| case res => res
| }
| }
defined class BOrd
scala> object BOrd {
| implicit def toBOrd(b: B) = new BOrd(b)
| }
defined module BOrd
scala> import AOrd._
import AOrd._
scala> import BOrd._
import BOrd._
scala> TreeMap[B, Int]()
res1: scala.collection.immutable.SortedMap[B,Int] = Map()