为什么我的伴随对象无法访问其伴随类中的方法

时间:2013-09-05 19:28:10

标签: scala

我是Scala的新手。我读到伴侣对象可以访问伴侣类的方法。我有以下代码:

class MinPath {
  def minPath(input : List[List[Int]], tempResult : List[List[Int]], currentlevel : Int) : List[List[Int]] = {
    ....
  }
}

object MinPath {
  ....
  def main(args : Array[String]) = {
    // This has an compile error
    val transformed =  minPath(input, List(List()), 0)
  }
}

它们在名为MinPath.scala的同一文件中定义。

但是对象中使用的minPath会导致编译错误,因为它无法找到minPath。

我想知道我在这里做错了什么?

3 个答案:

答案 0 :(得分:5)

没有人提到这种常见的模式,它避免了创建一个无关的实例:

scala> :pa
// Entering paste mode (ctrl-D to finish)

class Foo {
  def foo= 8
}
object Foo extends Foo {
  def main(args : Array[String]) = {
    Console println foo
  }
}

// Exiting paste mode, now interpreting.

defined class Foo
defined object Foo

scala> Foo main null
8

显然,如果foo是私有的,这也有效,这对我来说并不明显。也就是说,如果您扩展了一个您拥有私人访问权限的类,则可以无限制地访问其中的私有符号。

scala> :pa
// Entering paste mode (ctrl-D to finish)

class Foo {
  private def foo= 8
}
object Foo extends Foo {
  def main(args : Array[String]) = {
    Console println foo
  }
}

// Exiting paste mode, now interpreting.

defined class Foo
defined object Foo

scala> Foo main null
8

答案 1 :(得分:2)

main方法中,您必须在类minPath的实例上调用MinPath。所以你需要先创建一个实例:

object MinPath {
  def main(args: Array[String]) {
    // Create an instance
    val instance = new MinPath

    // Call the method on the instance
    val transformed = instance.minPath(input, List(List()), 0)
  }
}

答案 2 :(得分:1)

  

我读到伴侣对象可以访问伴侣类的方法。

这意味着,如果使用minPath访问级别声明protectedobject MinPath仍然可以访问该方法。 scala编译器不允许其他类访问它。

目前,它具有默认的公共访问级别,因此访问级别不是问题所在。

正如AlexIv指出的那样,您还需要创建class MinPath的实例才能使用该方法。

val mp = new MinPath
val transformed = mp.minPath(input, List(List()), 0)