如何解释关于私人[this]和方差的以下句子?

时间:2017-09-13 06:27:02

标签: scala variance

在第19章,#34; scala第2版编程",如何解释粗体句子?

  

对象私有成员只能从对象内访问   他们是谁定义的。事实证明,从中访问变量   定义它们的同一对象不会导致问题   方差。 直观的解释是,为了构建一个   如果差异会导致类型错误,你需要有一个   引用具有静态较弱类型的包含对象   而不是使用对象定义的类型。用于访问对象   但私有价值,这是不可能的。

1 个答案:

答案 0 :(得分:1)

我认为解释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();
    }
}

我能做到这一点的事实是因为:

  1. Java不会在编译时限制它(由于设计决定)
  2. 我有一个基础数组的引用,它允许我操纵它的内部值
  3. 当从外部谈论班级的私人领域时,这不成立。

    例如,假设以下类:

    class Holder[+T](initialValue: Option[T]) {
      private[this] var value: Option[T] = initialValue
    }
    

    当创建Holder的实例时,我对它的内部字段不可见,因此我无法像使用Java数组那样直接操作它们。这样,编译器确保它们受到保护,并且对字段的每个操作都必须通过一种方法,其中类型检查器是严格的并且不允许时髦的业务。