从方法返回嵌套类

时间:2013-06-05 21:45:39

标签: scala

我不明白有错误:

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]       ^

它是什么,如何摆脱它?

2 个答案:

答案 0 :(得分: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")
  }
}

答案 1 :(得分:1)

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

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

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")
  }
}

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