Scala没有参数的实例化类:{} vs()

示例

假设我们有一个MyClass类,没有构造函数参数:

class MyClass

在Scala中,我们可以使用以下语法实例化它:

val obj = new MyClass()

或者我们可以简单地写:

val obj = new MyClass

但是,如果不注意,在某些情况下,可选的括号可能会产生某些意外的行为。假设我们要创建一个任务,该任务应在单独的线程中运行。下面是示例代码:

val newThread = new Thread { new Runnable {
        override def run(): Unit = {
            // 执行任务
            println("执行任务。")
        }
      }
    }

newThread.start   // 没有输出

我们可能认为如果执行此示例代码,则可以打印执行任务。,但令我们惊讶的是,它什么也不会打印。让我们看看这里发生了什么。如果您仔细看一下,我们{}在之后紧接使用了花括号new Thread。它创建了一个匿名类,扩展了Thread:

val newThread = new Thread {
  //创建匿名类扩展线程
}

然后,在这个匿名类的主体中,我们定义了我们的任务(再次创建一个实现Runnable接口的匿名类)。因此,我们可能以为我们使用了构造函数,但实际上(通过忽略optional ),我们使用了在方法主体中未定义任何内容的构造函数。要解决此问题,我们需要使用括号而不是花括号。public Thread(Runnable target)()public Thread()run()

val newThread = new Thread ( new Runnable {
        override def run(): Unit = {
            // 执行任务
            println("执行任务。")
        }
      }
    )

换句话说,此处{}和()不可互换