我不明白有错误:
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] ^
它是什么,如何摆脱它?
答案 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")
}
}
这允许您隐藏类中接口的确切实现,但保持方法公开。 (如果您愿意,您的界面当然可以成为课程的一部分。)