Traits不能有构造函数参数。那么如何编写一个扩展的特征和抽象具有非空构造函数的类呢?
abstract class HasConsArgs(val i: Int)
trait Test extends HasConsArgs
哪个编译。但是在尝试使用时;
new Test {}
你得到一个错误not enough arguments for constructor HasConsArgs: ...
...为什么会这样,是否有可能让一个特征的实现者以某种方式调用这个构造函数?
class Impl(i: Int) extends Test //doesnt work
error: not enough arguments for constructor HasConsArgs: (i: Int)HasConsArgs.
失败,这意味着我可能需要Impl
扩展HasConsArgs
抽象类......
答案 0 :(得分:4)
在您的情况下,您无法使用Test
创建匿名类,因为您无法像您所见的那样指定超级构造函数参数。
如果特征扩展了一个类,那么混合特征的所有类必须是该类的子类或该类的后代类。
class A
class B extends A
class C
trait D extends A
class E extends D
class F extends A with D
class G extends B with D
class H extends C with D // fails
为了混合Test
特质,你可以写
class Impl(i: Int) extends HasConstArgs(i) with Test