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

时间:2018-09-10 08:16:21

标签: scala linearization

我有以下关于类和特征的声明

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 UU -> D -> T -> C
  • D with UU -> T -> D -> C
  • D with TT -> D -> C
  • C with UU -> T -> D -> C

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

type hierarchy

我的理解如下:

  • x1:之所以起作用,是因为线性化的类型相同(DT的顺序对该类型并不重要)
  • x2:因为...不起作用?
  • x3:由于无法实例化特征而无法使用
  • x4:不起作用,因为D with TU
  • super 类型

第2个是我遇到的问题。它应该可以在IMO上工作,因为D with T的线性化为D -> T -> C,这是C with U的线性化(即U -> T -> D -> C)的超类型。

要么我假设混合特征/类的顺序并不重要(但是为什么要编译第一个赋值?),或者我的线性化是错误的??

您能帮我吗?

1 个答案:

答案 0 :(得分:3)

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

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

扩展类的特征类似于自我类型,但有一些细微的差异。有关更多信息,请参见This answer