我在我们的代码库中遇到了一段代码,对我来说看似无效,但编译成功并可以正常工作。
object Main extends {
def main(args: Array[String]): Unit = {
print("Hello World")
}
}
Hello World
有人可以解释一下,这是怎么回事?
Main
类是否在此处扩展了匿名class
/ trait
?
答案 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]
,它似乎被指定为有效。