任何想法,为什么不提供类主体就无法创建单个特征的实例:
trait MyTrait
val test1 = new MyTrait // Does not compile.
val test2 = new MyTrait {} // Compiles.
但是,如果我添加另一个,那么我将能够创建一个实例:
trait MyTrait
trait SecondTrait
val anotherTest = new SecondTrait with MyTrait // Compiles successfully.
我本来期望相同的行为。
旁注::我已经读过this question。但是特质主体的存在并不能解决我的问题,因为第二个示例仍然没有主体。因此,为什么编译器将第二个示例视为匿名类?
答案 0 :(得分:2)
Instance Creation Expressions的规范说:
一个简单的实例创建表达式的格式为
new c
,其中c
是构造函数调用。令T
为c
的类型。然后T
必须表示scala.AnyRef
...的非抽象子类(的类型实例)...对于某些类模板
new t
,通用实例创建表达式的格式为t
。这样的表达式等效于块{ class a extends t; new a }
,其中a
是用户程序无法访问的匿名类的新名称。
在new MyTrait
中,MyTrait
在语法上 是合法的构造函数调用。因此new MyTrait
是一个简单实例创建表达式,由于MyTrait
并不“表示scala.AnyRef
的非抽象子类”而无法编译。
但是SecondTrait with MyTrait
不能是构造函数调用,因此它被视为 general 实例创建表达式的类模板,该实例创建了一个匿名类。 MyTrait {}
也是如此。