【发布时间】:2017-09-13 06:27:02
【问题描述】:
在第 19 章,“scala 2nd edition 编程”中,如何解释 bold 语句?
对象私有成员只能从对象内部访问 它们是定义的。事实证明,从 定义它们的同一对象不会导致问题 方差。 直观的解释是,为了构造一个 在方差会导致类型错误的情况下,您需要有一个 引用具有静态较弱类型的包含对象 比定义对象的类型。 用于访问对象 但是,私有值是不可能的。
【问题讨论】:
在第 19 章,“scala 2nd edition 编程”中,如何解释 bold 语句?
对象私有成员只能从对象内部访问 它们是定义的。事实证明,从 定义它们的同一对象不会导致问题 方差。 直观的解释是,为了构造一个 在方差会导致类型错误的情况下,您需要有一个 引用具有静态较弱类型的包含对象 比定义对象的类型。 用于访问对象 但是,私有值是不可能的。
【问题讨论】:
我认为解释 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();
}
}
我能做到这一点是因为:
当从外部谈论类的私有字段时,这并不成立。
例如,假设以下类:
class Holder[+T](initialValue: Option[T]) {
private[this] var value: Option[T] = initialValue
}
创建Holder 的实例时,我看不到它的内部字段,因此我无法像处理Java 数组那样直接操作它们。这样,编译器会确保它们受到保护,并且对字段的每次操作都必须通过一个方法,其中类型检查器是严格的,并且不允许时髦的业务。
【讨论】: