2017-09-13 10 views
1

제 19 장 "프로그래밍 스칼라 2 판"에서 굵게 문장을 설명하는 방법?비공개 [this] 및 variance에 대한 다음 문장을 설명하는 방법은 무엇입니까?

개체 전용 멤버는 정의 된 의 개체 내에서만 액세스 할 수 있습니다. 에서 변수에 액세스하면 정의 된 것과 동일한 객체가 분산에 문제를 일으키지 않습니다. 직관적 인 설명은 분산이 유형 오류를 발생시키는 사례를 구성하려면 정적으로 약한 유형 인 이 포함 된 객체에 대한 참조가 객체가 정의 된 유형보다 이어야합니다. 개체 개인 값에 액세스하는 경우 불가능합니다.

답변

1

마틴이 말하는 것을 설명하는 가장 직관적 인 방법은 자바로 배열을 보는 것입니다. 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. 는 자바 (때문에 디자인 결정에) 컴파일 시간이 제한되지 않습니다
  2. 나는 나를는 outsid에서 클래스의 private 필드에 대해 이야기 할 때이 보유하지 않는 내부 값

있어 조작 할 수 있습니다 기본 배열에 대한 참조가 이자형.

예를 들어, 다음 클래스 가정

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

Holder의 인스턴스를 생성, 나는 그것이 내부 필드의 보이지에 오전, 따라서 나는 자바 배열 한 직접처럼 조작 할 수 없습니다. 이런 식으로 컴파일러는 필드가 보호되고 있는지 확인하고 유형 검사기가 엄격하고 펑키 한 비즈니스를 허용하지 않는 메소드를 통해 각 필드를 조작해야합니다.