Scala 混合特征分配兼容性(层次结构)

Scala mixed traits assignment compatibility (hierarchy)

我有以下 类 和 traits

的声明
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):

我绘制了类型层次结构以获得更多见解:

我的理解如下:

2 号是我卡住的地方。 IMO 它应该工作,因为 D with T 的线性化是 D -> T -> C,它是 C with UU -> T -> D -> C)的线性化的超类型。

我假设混合 traits/classes 的顺序不重要(但为什么第一个赋值编译通过?)或者我的线性化是错误的或 ???

你能帮我解决这个问题吗?

问题是new C with U无效; val x2 的类型不相关。

特征U扩展了D,这意味着它只能应用于D的子class .由于 C 不是 D 的子 class,因此无法将特征应用于它。

扩展 class 的特征与自我类型相似,但有一些细微差别。有关详细信息,请参阅 This answer