例項化沒有引數的類 vs()

假設我們有一個沒有建構函式引數的 MyClass 類:

class MyClass

在 Scala 中,我們可以使用以下語法例項化它:

val obj = new MyClass()

或者我們可以簡單地寫:

val obj = new MyClass

但是,如果不注意,在某些情況下,可選括號可能會產生一些意想不到的行為。假設我們要建立一個應該在單獨的執行緒中執行的任務。以下是示例程式碼:

val newThread = new Thread { new Runnable {
        override def run(): Unit = {
            // perform task
            println("Performing task.")
        }
      }
    }

newThread.start   // prints no output

我們可能認為這個示例程式碼如果被執行將列印 Performing task.,但令我們驚訝的是,它不會列印任何東西。讓我們看看這裡發生了什麼。如果你仔細看看,我們在 new Thread 之後使用了花括號 {}。它建立了一個擴充套件 Thread 的匿名類:

val newThread = new Thread {
  //creating anonymous class extending Thread
}

然後在這個匿名類的主體中,我們定義了我們的任務(再次建立一個實現 Runnable 介面的匿名類)。所以我們可能認為我們使用了 public Thread(Runnable target) 建構函式,但事實上(通過忽略可選的 ())我們使用了 public Thread() 建構函式,並沒有在 run() 方法體中定義。為了解決這個問題,我們需要使用括號而不是花括號。

val newThread = new Thread ( new Runnable {
        override def run(): Unit = {
            // perform task
            println("Performing task.")
        }
      }
    )

換句話說,這裡 {}() 不可互換