不提供类主体就无法创建单个特征的实例的任何想法:
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 {}
也是如此。