Why is upcasting necessary in this Scala code?
问题 This compiles: 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 } But if the upcast is removed it fails to compile: import scala.collection._ trait Foo[A, +This <: SortedSet[A] with SortedSetLike[A,This]] extends SortedSetLike[A, This] { this: This => def bar: This = this.empty } Why? From the extends clause we know that Foo is a SortedSetLike[A, This] ,