Это компилирует:
import scala.collection._
trait Foo[A, +This <: SortedSet[A] with SortedSetLike[A,This]]
extends SortedSetLike[A, This] { this: This =>
def bar: This = (this: SortedSetLike[A,This]).empty
}
Но если upcast удален, он не скомпилируется:
import scala.collection._
trait Foo[A, +This <: SortedSet[A] with SortedSetLike[A,This]]
extends SortedSetLike[A, This] { this: This =>
def bar: This = this.empty
}
Почему? Из предложения extends
мы знаем, что Foo
является SortedSetLike[A, This]
, поэтому приведение вверх, конечно, допустимо, но разве это не показывает, что компилятор допустил конфликтующее наследование?