【问题标题】:Class cannot access its Companion object. (with import and class name)类无法访问其 Companion 对象。 (带有导入和类名)
【发布时间】:2015-09-10 17:00:10
【问题描述】:

我是 Scala 新手。我知道伴生对象只不过是具有相同类名的单例对象。如果一个单例对象就像使用静态方法一样,那意味着我应该能够访问它的方法而无需在类中创建实例。以下是我的代码sn-p:

class Main {

  import Main._

  def sayHelloWorld() {
    println("Hello World");
  }

  Main.sayHi //error
}

object Main {
  def sayHi() {
    println("Hi!");
  }
}

问题 1. 为什么我无法访问伴随对象的方法(尽管我已经指定了导入)?

问题2:如何使用对象名,不导入直接访问?

【问题讨论】:

  • test 来自哪里?
  • "问题 1. 为什么我无法访问伴随对象的方法(尽管我已经指定了导入)?"你可以。请发布您正在使用的实际代码。 test 未声明,并且您的代码中没有调用 sayHiI() 。如果有(在 Main 类中)它会工作
  • 谢谢!实际的问题是我没有将两者都绑定到一个对象上。 (REPL)
  • 附加信息:因为伴生对象和类必须在同一个源文件中定义,所以您不能在解释器中创建它们。来源:daily-scala 解决方法:将两者与 REPL 中的某个对象绑定
  • 您可以在 REPL 中创建它们,但您需要将其作为单个 :paste 命令的一部分(键入 :help 以获取 REPL 命令列表)。

标签: scala


【解决方案1】:

由于您提供的代码由于其他原因无法编译,因此很难猜测您遇到了什么问题。但假设你的意思是:

  class Main {

    import Main._

    def sayHelloWorld() {
      println("Hello World")
    }
    sayHi()
  }

  object Main {
    def sayHi() {
      println("Hi!")
    }
  }

然后在伴生对象中调用sayHi()

val m = new Main();                               //> Hi!

【讨论】:

  • 是的,很抱歉,测试不应该在代码中。感谢您的帮助!
【解决方案2】:

实际的问题是我没有将它们都与另一个对象绑定。 (REPL) 附加信息:因为伴生对象和类必须在同一个源文件中定义,所以您不能在解释器中创建它们。 来源:daily-scala 解决方法:将两者与 REPL 中的某个对象绑定 或如用户#shadowlands 所说 您可以在 REPL 中创建它们,但您需要将其作为单个 :paste 命令的一部分(键入 :help 以获取 REPL 命令列表)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2018-09-09
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多