1

我有以下类和特征的声明

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

我绘制了类型层次结构以获得更多洞察力:

类型层次结构

我的理解如下:

  • x1: 有效,因为线性化类型是相同的(类型的顺序DT不重要)
  • x2: 不工作,因为...?
  • x3: 不起作用,因为无法实例化特征
  • x4: 不工作,因为D with T类型U

2号是我卡住的地方。它应该适用于 IMO,因为is 的线性化D with T是(which is )D -> T -> C的线性化的超类型。C with UU -> T -> D -> C

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

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

4

1 回答 1

3

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

特征UextendsD这意味着它只能应用于D. 由于C不是Dtrait 的子类,因此不能应用于它。

扩展类的 trait 类似于 self 类型,但有一些细微的差别。有关更多信息,请参阅此答案

于 2018-09-10T10:40:36.797 回答