自我类型注释,为什么要使用self:=>而不是val?

时间:2013-12-22 02:41:42

标签: scala

我看到这段代码很常见:

trait A { this: B => ... }
trait A { self: B => ... }

但我想知道,为什么不使用它:

trait A { 
  val self: B = this

  //....
}

这将是一次无限递归?

更新:

这些是一样的吗?

    trait A { self => ... }
    trait A { val self = this }

2 个答案:

答案 0 :(得分:1)

我认为在大多数有用的情况下,您的第二个版本(使用字段)根本无法编译。

trait A { self: B => ... }

代码片段的内容是,A特征 混合的任何类必须 的类型B。例如,如果您正在编写仅适用于Logger类的特征,则可以使用trait X { self: Logger => ... }与编译器通信X特征仅用作Logger类的混合。

相比之下,您的替代解决方案意味着完全不同的东西:

trait A { 
  val self: B = this

  //....
}

当且仅当B :> ABA的超类型)时,此代码才会编译。我想不出任何有用的情况。即使您有隐藏外部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的实例,但这看起来像是不泄漏实现细节的好处

相关问题