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

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

最佳答案

Instance Creation Expressions的规范说:

new MyTrait中,MyTrait在语法上是合法的构造函数调用。因此,new MyTrait是一个简单的实例创建表达式,由于MyTrait不会“表示scala.AnyRef的非抽象子类”,因此无法编译。
但是SecondTrait with MyTrait不能是构造函数调用,因此它被视为一般实例创建表达式的类模板,该实例创建匿名类。 MyTrait {}也是如此。

07-24 09:28