假设我们有一个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("执行任务。") } } )
换句话说,此处{}和()不可互换。