2015-11-26 83 views
1

定义您好,世界特征有什么区别扩展类型和类型

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 

回答

3

你只能有extends以及Hello with World之后的类别或特征都不是(它是复合类型)。 extends Hello with World应被理解为“扩展HelloWorld”,而不是“扩展Hello with World”。

+0

正如你所说'特质右扩展(Hello with World)'它也编译错误;认为 –

+0

括号只是为了说清楚,它们是不允许的。我稍微改变了答案,使其更加清晰。 –

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中单独定义了复合类型的语法。它看起来像相同的语法,但它不是真的一样。

+0

谢谢你的回答,我现在可以分辨两者之间的不同 –

相关问题