scala中私有和私有[Class]声明有什么区别?

mer*_*nan 1 scala

下面的课程编译.如果有的话,我怎么能看到这两个范围之间的区别?

class C1 {
  private val p = 0
  private[C1] val pClass = 1

  def m1(other: C1) {
    println(other.p)
    println(other.pClass)
  }
}
Run Code Online (Sandbox Code Playgroud)

gou*_*ama 10

它们几乎是等价的,并且绝对在所有常见用例中都是等效的.

但是,两者之间实际上存在非常微小的语义差异:

  • private限制对封闭类C1及其伴随对象的访问,但该子类不继承该定义,并且不能覆盖父类中的定义.
  • private[C1]还限制C1对其及其伴随对象的访问,但该成员是继承的,并且可以被子类覆盖,只要该类可以访问它(如果它被括起来C1).

这是一个例子:

class A {
  private[A] val i = 1

  def display() { println(i) }

  class B extends A {
    override private[A] val i = 2
  }
}

val a = new A
a.display // 1
val b = new a.B
b.display // 2 !!
Run Code Online (Sandbox Code Playgroud)

B可以覆盖,i因为它可以访问它,并且它可以访问它,因为它是一个内部类A.这将无法编译,如果iprivate(无覆盖),如果override被拆除,然后display将返回1,而不是2.

所以基本上,除非你有内部类扩展类本身,private[C1]否则行为就像private.


请注意,由于上述原因,它们在字节码级别的实现方式不同:

  • private val p 创建:
    • 一个私人领域 p
    • 和私人访问方法 p()
  • private[C1] val pClass创造:
    • 一个私人领域 C1$$pClass
    • 公共访问方法C1$$pClass()