마틴이 말하는 것을 설명하는 가장 직관적 인 방법은 자바로 배열을 보는 것입니다. 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();
}
}
나는이 작업을 수행 할 수 있다는 사실 때문입니다 :
이 이
- 는 자바 (때문에 디자인 결정에) 컴파일 시간이 제한되지 않습니다
- 나는 나를는 outsid에서 클래스의 private 필드에 대해 이야기 할 때이 보유하지 않는 내부 값
있어 조작 할 수 있습니다 기본 배열에 대한 참조가 이자형.
예를 들어, 다음 클래스 가정
class Holder[+T](initialValue: Option[T]) {
private[this] var value: Option[T] = initialValue
}
Holder
의 인스턴스를 생성, 나는 그것이 내부 필드의 보이지에 오전, 따라서 나는 자바 배열 한 직접처럼 조작 할 수 없습니다. 이런 식으로 컴파일러는 필드가 보호되고 있는지 확인하고 유형 검사기가 엄격하고 펑키 한 비즈니스를 허용하지 않는 메소드를 통해 각 필드를 조작해야합니다.