【问题标题】:How to explain the following sentences about private[this] and variance?如何解释以下关于 private[this] 和 variance 的句子?
【发布时间】:2017-09-13 06:27:02
【问题描述】:

在第 19 章,“scala 2nd edition 编程”中,如何解释 bold 语句?

对象私有成员只能从对象内部访问 它们是定义的。事实证明,从 定义它们的同一对象不会导致问题 方差。 直观的解释是,为了构造一个 在方差会导致类型错误的情况下,您需要有一个 引用具有静态较弱类型的包含对象 比定义对象的类型。 用于访问对象 但是,私有值是不可能的。

【问题讨论】:

    标签: scala variance


    【解决方案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. 我有一个对底层数组的引用,它允许我操纵它的内部值

    当从外部谈论类的私有字段时,这并不成立。

    例如,假设以下类:

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      相关资源
      最近更新 更多