`synchronized`使用不同

lam*_*das 4 scala scala-collections

虽然看着scala.collection.mutable.SynchronizedStack我注意到synchronized使用不同,但有些方法使用synchronized[this.type]表单

override def push(elem: A): this.type = synchronized[this.type] { super.push(elem) }
override def pushAll(xs: TraversableOnce[A]): this.type = synchronized[this.type] { super.pushAll(elems) }
Run Code Online (Sandbox Code Playgroud)

和一些使用synchronized形式

override def isEmpty: Boolean = synchronized { super.isEmpty }
override def pop(): A = synchronized { super.pop }
Run Code Online (Sandbox Code Playgroud)

有什么不同?

Mal*_*off 6

synchronized(由声明AnyRef)的签名是

final def synchronized[T0](arg0: => T0): T0
Run Code Online (Sandbox Code Playgroud)

如果你用它

override def isEmpty: Boolean = synchronized { super.isEmpty }
Run Code Online (Sandbox Code Playgroud)

然后你把它留给编译器来推断传递给synchronized(这里Boolean)的函数的返回类型.如果你用它

override def push(elem: A): this.type = synchronized[this.type] {
  super.push(elem)
}
Run Code Online (Sandbox Code Playgroud)

然后你明确指定返回类型(这里this.type).我假设编译器不会推断this.type- 哪些状态表明你确切地返回了this对象 - 但是它会推断它SynchronizedStack或其中一个超类型,它不像那样精确this.type.

  • 对 - 编译器不推断单例类型. (2认同)