10
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
}
但如果上溯造型被刪除它未能編譯:
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]
,所以upcast當然是有效的 - 但是這不表明編譯器允許發生衝突繼承嗎?
我不知道這種情況的具體細節,但它是可能發生的可怕事情的另一個例子,因爲子類中的方法可能比它們實現的方法簽名具有更多特定的返回類型。 –