2012-08-13 34 views
4

雖然看着scala.collection.mutable.SynchronizedStack我注意到​​使用的不同,一些方法使用synchronized[this.type]形式`synchronized`使用不同

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) } 

和一些應用​​形式

override def isEmpty: Boolean = synchronized { super.isEmpty } 
override def pop(): A = synchronized { super.pop } 

有什麼區別?

回答

6

的​​(由AnyRef聲明)的簽名是

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

如果你用它作爲

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

然後你把它留給編譯器來推斷傳遞給函數的返回類型​​(這裏是Boolean)。如果您使用它作爲

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

然後您明確指定返回類型(這裏this.type)。我假定編譯器不會推斷出this.type - 哪一個表示您確切返回this對象 - ,但它會推斷SynchronizedStack或它的一個超類型,其精度不如this.type

+2

右鍵 - 編譯器不會推斷單例類型。 – 2012-08-13 07:42:07

+0

@ Jean-PhilippePellet感謝您的澄清。您能否提供參考,例如規格? – 2012-08-13 08:53:08

+0

這是我能找到的:[單身人士的類型是卑鄙和惡意](http://www.scala-lang.org/node/6583)。 – 2012-08-13 09:00:54

相關問題