实例化没有参数的类 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.")
}
}
)
换句话说,这里 {}
和 ()
不可互换。