单个特征与混合的实例化

时间:2019-03-20 19:27:10

标签: scala

任何想法,为什么不提供类主体就无法创建单个特征的实例:

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。但是特质主体的存在并不能解决我的问题,因为第二个示例仍然没有主体。因此,为什么编译器将第二个示例视为匿名类?

1 个答案:

答案 0 :(得分:2)

Instance Creation Expressions的规范说:

  

一个简单的实例创建表达式的格式为new c,其中c是构造函数调用。令Tc的类型。然后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 {}也是如此。