问题描述
它将编译:
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
}
为什么?从extends
子句中我们知道Foo
是SortedSetLike[A, This]
,因此向上转换当然是有效的-但是这不表明编译器允许发生冲突的继承吗?
Why? From the extends
clause we know that Foo
is a SortedSetLike[A, This]
, so the upcast is valid of course - but doesn't this show that the compiler has allowed conflicting inheritance to occur?
推荐答案
SortedSetLike 特性从 SetLike 继承了 empty 方法. >
The SortedSetLike trait inherits the empty method from SetLike.
/** The empty set of the same type as this set
* @return an empty set of type `This`.
*/
def empty: This
但是 SortedSet 会覆盖 empty 方法,并且具有显式的返回类型:
But SortedSet overrides the empty method and has an explicit return type:
/** Needs to be overridden in subclasses. */
override def empty: SortedSet[A] = SortedSet.empty[A]
由于您指定此是 SortedSet 的子类,因此编译器将找到 SortedSet 的 empty 首先,它返回一个 SortedSet .编译器不知道如何将结果 SortedSet 转换为您的 This 子类.
Since you specify that This is a subclass of SortedSet the compiler will find SortedSet's implementation of empty first, which returns a SortedSet. The compiler does not know how to convert the resulting SortedSet to your This subclass.
但是,如果您转换为 SortedSetLike 特性,则编译器将找到其 empty 方法,该方法返回 This .
But if you upcast to the SortedSetLike trait the compiler will find its empty method which returns a This.
这篇关于为什么在此Scala代码中必须进行向上转换?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!