比如在scala文件中我定义了一个类
private class Test{}
Run Code Online (Sandbox Code Playgroud)
这里的私人意味着什么?在java中,你不能拥有顶级私有类,这显然是有道理的.但是私有在scala中在语法上是有效的,希望有人可以对它有所了解.
sen*_*nia 16
您可以为private修饰符指定包名称,以允许仅从指定的包访问此类.默认情况下(未指定包),它仅对封闭包中的其他成员可见.
$ cat > test.scala <<EOF
package myPackage {
private[myPackage] class Test
private object A extends Test
}
package otherPackage {
object B extends myPackage.Test
}
EOF
$ scalac test.scala
test.scala:7: error: class Test in package myPackage cannot be accessed in package myPackage
object B extends myPackage.Test
^
one error found
Run Code Online (Sandbox Code Playgroud)
例如,您可以private从其伴随对象访问类,如下所示:
trait ITest
private class Test extends ITest
object Test {
def apply(): ITest = new Test
}
Test()
// ITest = Test@59e2abc3
Run Code Online (Sandbox Code Playgroud)
进一步澄清示例:
package myPackage {
private class Test
private object A extends Test
object B extends myPackage.Test //Compile error: private class Test escapes its defining scope as part of type myPackage.Test
private object C extends myPackage.Test // works since C is also private
object Test {
def apply() = new Test //error: private class Test escapes its defining scope as part of type myPackage.Test
}
object Test2 {
def apply(): ITest = new Test //works as ITest is public
}
}
Run Code Online (Sandbox Code Playgroud)
只要私有类的实例不转义封闭的包范围,它就可以在包层次结构中使用.访问私有类的伴随对象也必须位于相同的包层次结构中.使用private[P]- p可以是任何存在的包名称.
| 归档时间: |
|
| 查看次数: |
4768 次 |
| 最近记录: |