定义Hello和World trait
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
答案 0 :(得分:3)
extends
后只能有一个类或一个特征,而Hello with World
都不是(它是一个复合类型)。 extends Hello with World
应理解为“使用Hello
扩展World
”,而不是“扩展Hello with World
”。
答案 1 :(得分:2)
根据SLS 5.3,trait Hello
是trait Hello extends AnyRef
的缩写(“extends
子句[...]可以省略,在这种情况下假定extends scala.AnyRef
”
根据SLS 5.1,“可以编写以特征引用开头的父母列表[...]在这种情况下,父母列表被隐式扩展为包括mt1的超类型作为第一父类型。“
因此trait Right extends Hello with World
实际上是trait Right extends AnyRef with Hello with World
的缩写。
至于为什么使用类型别名搞砸了,如果你看一下语法定义,语法不是extends <type>
,而是字面意思extends <sc> with <mt1> with <mt2> ...
。复合类型的语法在SLS 3.2.7中单独定义。它看起来像是相同的语法,但它并不完全相同。