在查看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) }
和一些使用synchronized
表格
override def isEmpty: Boolean = synchronized { super.isEmpty }
override def pop(): A = synchronized { super.pop }
有什么区别?
答案 0 :(得分:6)
synchronized
的签名(由AnyRef
声明)是
final def synchronized[T0](arg0: => T0): T0
如果您将其用作
override def isEmpty: Boolean = synchronized { super.isEmpty }
然后你把它留给编译器来推断传递给synchronized
的函数的返回类型(这里是Boolean
)。如果你用它
override def push(elem: A): this.type = synchronized[this.type] {
super.push(elem)
}
然后你明确指定了返回类型(这里是this.type
)。我假设编译器不会推断出this.type
- 它表明你确切地返回了this
个对象 - 但它会推断SynchronizedStack
或其中一个超类型,这不像this.type
。