单个特征与混合的实例化

hum*_*der 7 scala

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

trait MyTrait
val test1 = new MyTrait // Does not compile.
val test2 = new MyTrait {} // Compiles.
Run Code Online (Sandbox Code Playgroud)

但是,如果我将另一个添加到混合中,则可以创建一个实例:

trait MyTrait
trait SecondTrait
val anotherTest = new SecondTrait with MyTrait  // Compiles successfully.
Run Code Online (Sandbox Code Playgroud)

我本来期望相同的行为。

旁注:我已经读过这个问题。但是特质主体的存在并不能解决我的问题,因为第二个示例仍然没有主体。因此,为什么编译器将第二个示例视为匿名类?

Ale*_*nov 2

实例创建表达式的规范说:

一个简单的实例创建表达式的形式是构造函数调用new ccT成为 的类型c。那么必须表示...T的非抽象子类(的类型实例)scala.AnyRef

一般实例创建表达式具有new t某种类模板的形式t。这样的表达式相当于块,{ class a extends t; new a }其中a 是用户程序无法访问的匿名类的新名称。

new MyTrait,中,在语法上MyTrait是合法的构造函数调用。一个简单的实例创建表达式也是如此,它无法编译,因为它不“表示“的非抽象子类”。new MyTraitMyTraitscala.AnyRef

SecondTrait with MyTrait不能是构造函数调用,因此它被视为通用实例创建表达式的类模板,该表达式创建匿名类。这同样适用于MyTrait {}.