Scala对象什么也没有扩展

时间:2019-07-04 16:06:31

标签: scala extend

我在我们的代码库中遇到了一段代码,对我来说看似无效,但编译成功并可以正常工作。

object Main extends {
  def main(args: Array[String]): Unit = {
    print("Hello World")
  }
}
  

Hello World

有人可以解释一下,这是怎么回事?
Main类是否在此处扩展了匿名class / trait

2 个答案:

答案 0 :(得分:8)

如果我们使用scala -Xprint:typer反编译代码,则会看到Main扩展了AnyRef

scalac -Xprint:typer Main.scala                                                                                               
[[syntax trees at end of                     typer]] // Main.scala
package com.yuvalitzchakov {
  object Main extends scala.AnyRef {
    def <init>(): com.yuvalitzchakov.Main.type = {
      Main.super.<init>();
      ()
    };
    def main(args: Array[String]): Unit = scala.Predef.print("Hello World")
  }
}

这也记录在Scala specification中的对象/类定义下:

  

一个对象定义定义了一个   新类的单个对象。它最一般的形式是object m extends t。在这里,m是要定义的对象的名称,t是一个   表单模板

     

sc with mt1 with … with mtn { stats }定义了基类,   m的行为和初始状态。 可以忽略扩展子句extends sc with mt1 with … with mtn,在这种情况下扩展了scala.AnyRef   是假定的。

此语法对early initializers也有效:

abstract class X {
  val name: String
  val size = name.size
}

class Y extends {
  val name = "class Y"
} with X

答案 1 :(得分:2)

它变淡了

object Main extends Object

您可以通过使用scalac -print进行编译来进行检查。

Grammar状态

ClassTemplateOpt  ::=  ‘extends’ ClassTemplate | [[‘extends’] TemplateBody]

其中

TemplateBody      ::=  [nl] ‘{’ [SelfType] TemplateStat {semi TemplateStat} ‘}’

据我所知,如果我们检查[[‘extends’] TemplateBody],它似乎被指定为有效。