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を正確に返すことを示していますが、.thisSynchronizedStackthis.type

于 2012-08-13T06:19:03.583 に答える