Scala 扩展类型和扩展类型有什么区别

Scala 扩展类型和扩展类型有什么区别,scala,Scala,定义Hello和World特征 trait Hello trait World 这没问题 trait Right extends Hello with World 但这有一个编译错误 type HelloWorld = Hello with World trait Error extends HelloWorld //Error:(9, 22) class type required but A$A65.this.Hello with A$A65.this.World found 在e

定义Hello和World特征

trait Hello

trait World
这没问题

trait Right extends Hello with World
但这有一个编译错误

type HelloWorld = Hello with World

trait Error extends HelloWorld
//Error:(9, 22) class type required but A$A65.this.Hello with A$A65.this.World found

在extends之后只能有一个类或trait,而hellowithworld既不是复合类型,也不是复合类型。扩展Hello with World应理解为扩展Hello with World,而不是扩展Hello with World。

扩展后只能有一个类或特征,而Hello with World既不是复合类型,也不是复合类型。extends Hello with World应理解为extends Hello with World,而不是extends Hello with World。

根据SLS 5.3,trait Hello是trait Hello extends AnyRef的缩写。extends子句[…]可以省略,在这种情况下,假定extends scala.AnyRef

根据SLS 5.1,可以编写一个以特征引用开始的父项列表[…],在这种情况下,父项列表被隐式扩展,以包含mt1的超类型作为第一个父项类型

因此,trait Right扩展Hello with World实际上是trait Right扩展AnyRef with Hello with World的缩写

至于为什么使用类型别名会把事情搞砸,如果你看一下语法定义,语法不是extends,而是extends with。。。。复合类型的语法在SLS 3.2.7中单独定义。它看起来是相同的语法,但实际上并不相同。

在SLS 5.3中,trait Hello是trait Hello的缩写,它扩展了AnyRef。可以省略extends子句[…],在这种情况下,假定extends scala.AnyRef

根据SLS 5.1,可以编写一个以特征引用开始的父项列表[…],在这种情况下,父项列表被隐式扩展,以包含mt1的超类型作为第一个父项类型

因此,trait Right扩展Hello with World实际上是trait Right扩展AnyRef with Hello with World的缩写


至于为什么使用类型别名会把事情搞砸,如果你看一下语法定义,语法不是extends,而是extends with。。。。复合类型的语法在SLS 3.2.7中单独定义。它看起来是相同的语法,但实际上并不相同。

正如您所说,trait Right扩展了Hello with World,它还存在编译错误;我想括号只是为了说明,是不允许的。我对答案做了一点修改,以使它更清楚。正如你所说,trait Right扩展了Hello with World,它还存在编译错误;我想括号只是为了说明,是不允许的。谢谢你的回答,我现在可以分辨出两者的不同。谢谢你的回答,我现在可以分辨出两者的不同