我有以下类和特征的声明
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 -> C
D with U
:U -> T -> D -> C
D with T
:T -> D -> C
C 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 U
U -> T -> D -> C
我假设混合特征/类的顺序并不重要(但是为什么第一个分配编译?)或者我的线性化是错误的或???
你能帮我解决这个问题吗?