Scala 如何解释以下关于private[这个]和variance的句子?

Scala 如何解释以下关于private[这个]和variance的句子?,scala,variance,Scala,Variance,在第19章“scala第二版编程”中,如何解释粗体语句 只能从中的对象内部访问对象私有成员 它们是被定义的。事实证明,从 定义它们的同一个对象不会导致 差异直观的解释是,为了构建 如果差异会导致类型错误,则需要 对静态较弱类型的包含对象的引用 而不是定义对象的类型。用于访问对象 然而,私人价值观是不可能的 我认为解释Martin想说什么的最直观的方法是看Java中的数组。Java中的数组是协变的,但不根据协变规则进行类型检查。这意味着它们在运行时而不是编译时爆炸: abstract class

在第19章“scala第二版编程”中,如何解释粗体语句

只能从中的对象内部访问对象私有成员 它们是被定义的。事实证明,从 定义它们的同一个对象不会导致 差异直观的解释是,为了构建 如果差异会导致类型错误,则需要 对静态较弱类型的包含对象的引用 而不是定义对象的类型。用于访问对象 然而,私人价值观是不可能的


我认为解释Martin想说什么的最直观的方法是看Java中的数组。Java中的数组是协变的,但不根据协变规则进行类型检查。这意味着它们在运行时而不是编译时爆炸:

abstract class Animal {}
class Girafee extends Animal {}
class Lion extends Animal {}

public class Foo {
    public static void main(String[] args) {
        Animal[] animals = new Girafee[10];
        animals[0] = new Lion();
    }
}
我之所以能做到这一点,是因为:

  • Java在编译时不限制这一点(由于设计决策)
  • 我有一个对底层数组的引用,它允许我操作它的内部值
  • 当从外部谈论类的私有字段时,这是不成立的

    例如,假设以下类:

    class Holder[+T](initialValue: Option[T]) {
      private[this] var value: Option[T] = initialValue
    }
    
    创建
    Holder
    实例时,它的内部字段看不到我,因此我无法像处理Java数组那样直接操作它们。通过这种方式,编译器确保它们受到保护,并且对字段的每次操作都必须通过一个方法进行,其中类型检查器是严格的,不允许出现不正常的业务