我想知道在使用 trait
时结合 abstract
关键字的语义。
如果 trait
没有定义任何抽象方法,那么使用 abstract
关键字并不会阻止我创建一个实例:
scala> abstract trait T
defined trait T
scala> new T{}
res0: java.lang.Object with T = $anon$1@12cd927d
另一方面,如果特征定义了一个抽象方法,无论是否存在abstract
关键字,我都不能创建实例(当然,必须实现此方法):
scala> abstract trait T { def foo : Unit }
defined trait T
scala> new T{}
<console>:9: error: object creation impossible, since method foo in trait T of type => Unit is not defined
new T{}
^
scala> trait T { def foo : Unit }
defined trait T
scala> new T{}
<console>:9: error: object creation impossible, since method foo in trait T of type => Unit is not defined
new T{}
^
那么,在一个 trait
前面加上 abstract
关键字有什么好处呢?
new T{}
时,你创建了一个匿名对象,它混入了特质 T。 - kiritsuku