【问题标题】:Instantiating the same scala class from main从 main 实例化相同的 scala 类
【发布时间】:2018-02-07 10:50:12
【问题描述】:

在 Java 中,我通常会这样做:

class Hello {
    public Hello() {
        System.out.println("hello");
    }

    public static void main(String args[]) {
        new Hello();
    }
}

如何在 Scala 中做类似的事情?我从 Hello 作为 Scala 对象开始,如下所示:

object Hello {

    // constructor goes here

    def main(args: Array[String]): Unit = {
        println("hello") // new Hello() would go here
    }
}

但我无法实例化它。如果我更改我将 object 关键字更改为 class 然后 scala 编译器会抱怨,即

class Hello {

    println("hello")

    def main(args: Array[String]): Unit = {
        new Hello()
    }
}

我知道我可能完全走错了路,但我想摆脱痛苦。

【问题讨论】:

    标签: scala


    【解决方案1】:

    通常在 Scala 中我使用代表应用程序的对象:

    object Hello extends App {
        println("hello")
    }
    

    【讨论】:

      【解决方案2】:

      我认为您不了解 Scala object 是什么。它实际上相当于一个 Java 单例,其中创建并实例化了一个匿名类。

      如果您在这种情况下将代码重新编译为 Java:

      object Hello {}
      

      它会得到类似的东西:

      public class Hello$ {
        public static Hello$ $MODULE = new Hello$()
      }
      

      这已经是一个单例,相当于val。你甚至可以这样做:

      val x = Hello; // x will be of type Hello.type
      

      【讨论】:

      • 感谢您的帮助。我知道一个对象相当于一个 Java 单例我只是想知道启动 Scala 应用程序的常用方法是什么。您是否从一个对象开始,然后使用它在单独的文件中实例化一堆其他 scala 类?
      • 扩展App 以避免必须声明main 不是重点吗? scala-lang.org/api/current/index.html#scala.App
      • 其实你不需要扩展App来获得一个可启动的程序;只需定义任何objectmain 方法就足够了。 (重要的是要记住:如果该对象有一个伴侣 classtrait,则将其用作主类将不起作用。)但是,如果您扩展 App 特征,您只需编写您的代码到object 的主体中,根本不需要定义任何方法。像这样object Example extends App { println("Yay, it works!") }
      • 感谢大家的帮助!
      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 2011-07-03
      • 2020-07-29
      • 1970-01-01
      • 2014-04-10
      • 2011-08-24
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多