我有以下类和特征的声明
class C
class D extends C
trait T extends C
trait U extends D with T
以及以下任务:
val x1:C with T with U = new D with U
val x2:D with T = new C with U
val x3:D with T = new U
val x4:U = new D with T
第一项作业有效,其他作业无效。我想了解这两种情况的原因。
据我了解,线性化如下(->手段extends):
C with T with U:U -> D -> T -> CD with U:U -> T -> D -> CD with T:T -> D -> CC with U:U -> T -> D -> C
我绘制了类型层次结构以获得更多洞察力:
我的理解如下:
x1: 有效,因为线性化类型是相同的(类型的顺序D和T不重要)x2: 不工作,因为...?x3: 不起作用,因为无法实例化特征x4: 不工作,因为D with T是超类型U
2号是我卡住的地方。它应该适用于 IMO,因为is 的线性化D with T是(which is )D -> T -> C的线性化的超类型。C with UU -> T -> D -> C
我假设混合特征/类的顺序并不重要(但是为什么第一个分配编译?)或者我的线性化是错误的或???
你能帮我解决这个问题吗?
