假设我们有
scala> trait A { val y: Int; val x = 1; val y2 = y + 1 }
scala> trait B { val y: Int = 1; val x: Int; val x2 = x + 1 }
scala> class C extends A with B
然后两者都 y2
应该x2
以 2 in 的值结束C
。现在,如果我们混入A
thenB
则y2
值为 1,因为 的值为y
默认值 0。同样,如果我们混入then 则x2
值为 1 。此外,如果这些东西是 Objects 而不是 Ints,那么我们最终可能会得到一个.B
A
NullPointerException
在理想的世界中,我想要的是初始化不是懒惰的,而是初始化的顺序由值的依赖图自动暗示。即一种告诉编译器重新调整初始化顺序而不是使用默认值的方法。此外,我不想将特征重构为更小的特征,然后自己制定正确的混合顺序(在一个巨大的项目中,有时我必须混合 5 个特征,这很难解决)。
更新:换句话说……当我们混合特征时,我们想象将特征叠加在彼此之上,但是当涉及到 vals 时,它并没有真正像这样工作……如何让它像这样工作
更新:如果真的不可能,我会很高兴有人可以共享一个链接,指向任何已经存在的类型安全功能请求票,方法是向 scala 添加一个名为“overlay”的关键字,该关键字可以沿线使用的:
scala> class C overlay A overlay B