实例化没有参数的类 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.")
        }
      }
    )

换句话说,这里 {}() 不可互换