【问题标题】:Scala object extends nothingScala 对象什么都不扩展
【发布时间】:2019-07-05 04:19:28
【问题描述】:

我在我们的代码库中发现了一段代码,对我来说它看起来无效,但编译成功并且工作正常。

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

你好世界

谁能解释一下,这里发生了什么?
Main 类是否在此处扩展了匿名 class/trait

【问题讨论】:

标签: scala extend


【解决方案1】:

如果我们使用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子句extends sc with mt1 with … with mtn可以省略,在这种情况下extends scala.AnyRef 是假定的。

此语法对early initializers 也有效:

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

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

【讨论】:

    【解决方案2】:

    脱糖成

    object Main extends Object
    

    您可以通过使用scalac -print 编译来检查这一点。

    Grammar 状态

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

    在哪里

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2017-01-19
      • 1970-01-01
      • 2019-09-07
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多