在 GitHub 上编辑此页面

已弃用:private[this] 和 protected[this]

private[this]protected[this] 访问修饰符已弃用,并将逐步淘汰。

以前,这些修饰符是必需的,用于

  • 避免生成 getter 和 setter
  • 从方差检查中排除 private[this] 下的代码。(Scala 2 也排除 protected[this],但发现这并不健全,因此已删除)。
  • 如果 private[this] val 未被类方法访问,则避免生成字段。

编译器现在推断private成员只能通过this访问的事实。此类成员将被视为已声明为private[this]protected[this]将被删除,不会替换。

此更改在某些情况下可能会改变 Scala 程序的语义,因为private val 不再保证会生成字段。如果以下情况,则会省略该字段:

  • val 只能通过this访问,并且
  • val 未从当前类中的方法访问。

如果程序尝试通过反射访问丢失的私有字段,这可能会导致问题。建议的解决方法是将字段声明为限定私有,并使用封闭类作为限定符。示例

class C(x: Int):
    private[C] val field = x + 1
      // [C] needed if `field` is to be accessed through reflection
    val retained = field * field