1

有一个我不明白的错误:

class MyClass1 {
  private class MyClass1Internal(a: Int, b: Int, c: String, d: String)
  def method1 = {
    // doing something
    new MyClass1Internal(1, 2, "3", "4")
  }
}

一个错误

private class MyClass1Internal escapes its defining scope as part of type MyClass1.this.MyClass1Internal
[error]   def method1 = {
[error]       ^

它是关于什么的,我该如何摆脱它?

4

2 回答 2

6

MyClass1Internal是私有的,因此永远不能在 之外访问MyClass1,但method会在这个类之外返回它的一个实例(因为它是公共的),从而打破了它的定义范围。

我敢打赌,如果您将其定义method为私有,它将修复此错误。您还可以使嵌套类不是私有的。

还有一件事,如果您希望其他代码能够使用该类但不能实例化它,那么只需将构造函数设为私有并将类设为公共,如下所示:

class MyClass1 {
  class MyClass1Internal private[MyClass1](a: Int, b: Int, c: String, d: String)
  def method1 = {
    // doing something
    new MyClass1Internal(1, 2, "3", "4")
  }
}
于 2013-06-05T21:47:59.707 回答
1

公共 APIMyClass1使用其私有 API ( MyClass1Internal) 的一部分。这很糟糕,因为另一个类不知道MyClass1Internal,因此无法理解method1.

如果您不想公开MyClass1Internal但仍向其返回实例,则必须将 upcastmethod1的返回类型转换为公共的东西。例如:

trait MyClass1Interface {
  def a: Int
}

class MyClass1 {
  private class MyClass1Internal(val a: Int, b: Int, c: String, d: String)
    extends MyClass1Interface
  def method1: MyClass1Interface = {
    // doing something
    new MyClass1Internal(1, 2, "3", "4")
  }
}

这允许您在类中隐藏接口的确切实现,但保持方法公开。(如果您愿意,您的界面当然仍然可以成为该类的一部分)。

于 2013-06-05T22:33:30.873 回答