4

在查看时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 }

有什么不同?

4

1 回答 1

6

synchronized(由 声明)的签名AnyRef

final def synchronized[T0](arg0: => T0): T0

如果您将其用作

override def isEmpty: Boolean = synchronized { super.isEmpty }

然后你把它留给编译器来推断传递给synchronized(here Boolean)的函数的返回类型。如果您将其用作

override def push(elem: A): this.type = synchronized[this.type] {
  super.push(elem)
}

然后您明确指定返回类型(此处this.type)。我假设编译器不会推断this.type——这表明你返回的正是this对象——但它会推断出SynchronizedStack它的超类型之一,这不如this.type.

于 2012-08-13T06:19:03.583 回答