我看到这段代码很常见:
trait A { this: B => ... }
trait A { self: B => ... }
但我想知道,为什么不使用它:
trait A {
val self: B = this
//....
}
这将是一次无限递归?
更新:
这些是一样的吗?
trait A { self => ... }
trait A { val self = this }
答案 0 :(得分:1)
我认为在大多数有用的情况下,您的第二个版本(使用字段)根本无法编译。
trait A { self: B => ... }
代码片段的内容是,A
特征 混合的任何类必须 的类型B
。例如,如果您正在编写仅适用于Logger
类的特征,则可以使用trait X { self: Logger => ... }
与编译器通信X
特征仅用作Logger
类的混合。
相比之下,您的替代解决方案意味着完全不同的东西:
trait A {
val self: B = this
//....
}
当且仅当B :> A
(B
是A
的超类型)时,此代码才会编译。我想不出任何有用的情况。即使您有隐藏外部this
的嵌套类,您仍然可以使用类似Java的OuterClassName.this
语法来获取封闭类的this
引用。
答案 1 :(得分:1)
我认为没有任何显着差异 你可以随时替换
trait A { bla: B => }; trait AA extends A with B
与
trait A { def bla: B }; trait AA extends A { val bla = new B }
当然,AA在这种情况下不是B的实例,但这看起来像是不泄漏实现细节的好处