编译:
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]
,因此upcast当然是有效的 - 但是这并不表明编译器允许发生冲突的继承吗?
答案 0 :(得分:4)
SortedSetLike 特征从 SetLike 继承 empty 方法。
/** The empty set of the same type as this set
* @return an empty set of type `This`.
*/
def empty: This
但 SortedSet 会覆盖 empty 方法并具有明确的返回类型:
/** Needs to be overridden in subclasses. */
override def empty: SortedSet[A] = SortedSet.empty[A]
由于您指定此是 SortedSet 的子类,编译器将找到 SortedSet 的空的实现>首先,它返回 SortedSet 。编译器不知道如何将生成的 SortedSet 转换为 This 子类。
但如果您向 SortedSetLike 特征转发,编译器将找到其空方法,该方法返回此。