为什么在此Scala代码中需要向上转换?

时间:2015-06-26 18:58:50

标签: scala scala-collections upcasting

编译:

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子句我们知道FooSortedSetLike[A, This],因此upcast当然是有效的 - 但是这并不表明编译器允许发生冲突的继承吗?

1 个答案:

答案 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 特征转发,编译器将找到其方法,该方法返回