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
):
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
是 super 类型的 U
2 号是我卡住的地方。 IMO 它应该工作,因为 D with T
的线性化是 D -> T -> C
,它是 C with U
(U -> T -> D -> C
)的线性化的超类型。
我假设混合 traits/classes 的顺序不重要(但为什么第一个赋值编译通过?)或者我的线性化是错误的或 ???
你能帮我解决这个问题吗?
问题是new C with U
无效; val x2
的类型不相关。
特征U
扩展了D
,这意味着它只能应用于D
的子class .由于 C
不是 D
的子 class,因此无法将特征应用于它。
扩展 class 的特征与自我类型相似,但有一些细微差别。有关详细信息,请参阅 This answer。
我有以下 类 和 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
):
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
是 super 类型的U
2 号是我卡住的地方。 IMO 它应该工作,因为 D with T
的线性化是 D -> T -> C
,它是 C with U
(U -> T -> D -> C
)的线性化的超类型。
我假设混合 traits/classes 的顺序不重要(但为什么第一个赋值编译通过?)或者我的线性化是错误的或 ???
你能帮我解决这个问题吗?
问题是new C with U
无效; val x2
的类型不相关。
特征U
扩展了D
,这意味着它只能应用于D
的子class .由于 C
不是 D
的子 class,因此无法将特征应用于它。
扩展 class 的特征与自我类型相似,但有一些细微差别。有关详细信息,请参阅 This answer。