为什么使用非空构造函数扩展抽象类的 Trait 会编译?

Nig*_*olf 5 inheritance constructor scala traits

特征不能有构造函数参数。那么如何编写一个扩展类和具有非空构造函数的抽象类的特征呢?

abstract class HasConsArgs(val i: Int)
trait Test extends HasConsArgs
Run Code Online (Sandbox Code Playgroud)

哪个编译。但是在尝试使用时;

new Test {}
Run Code Online (Sandbox Code Playgroud)

你得到一个错误not enough arguments for constructor HasConsArgs: .........为什么会这样,是否有可能让 trait 的实现者以某种方式调用这个构造函数?

class Impl(i: Int) extends Test //doesnt work 
Run Code Online (Sandbox Code Playgroud)

失败,error: not enough arguments for constructor HasConsArgs: (i: Int)HasConsArgs.这意味着我可能需要Impl扩展HasConsArgs抽象类......

Ari*_*iao 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
Run Code Online (Sandbox Code Playgroud)

为了混合Test特征,你可以写

class Impl(i: Int) extends HasConstArgs(i) with Test
Run Code Online (Sandbox Code Playgroud)