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

时间:2013-08-31 15:44:48

标签: scala

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

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

  def m1(other: C1) {
    println(other.p)
    println(other.pClass)
  }
}

1 个答案:

答案 0 :(得分: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 !!

B可以覆盖i,因为它可以访问它,并且可以访问它,因为它是A的内部类。如果iprivate(无需覆盖),则无法编译,如果override被删除,则display将返回1而不是{{1} }}

所以基本上,除非你有扩展类本身的内部类,否则2的行为与private[C1]完全相同。


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

  • private创建:
    • 私人字段private val p
    • 和私人访问方法p
  • p()创建:
    • 私人字段private[C1] val pClass
    • 公共访问方法C1$$pClass