2011-08-07 3 views
2

I 다음 예를 가지고게터가없는 필드에 액세스 할 수있는 이유는 무엇입니까?

package cage; 

import java.util.HashSet; 
import java.util.Set; 

import animals.Animal; 

public class Cage<T extends Animal> { //A cage for some types of animals 
    private Set<T> set = new HashSet<T>(); 

    public void add(T animal) { 
     set.add(animal); 
    } 

    public void showAnimals() { 
     for (T animal : set) { 
      System.out.println(animal.getName()); 
     } 
    } 

    public void transferTo(Cage<? super T> cage) { 
     cage.set.addAll(this.set); 
    } 
} 

메인 클래스 : 호출

cage.set.addAll (this.set 께)가 클래스 케이지

package exe; 

import cage.Cage; 
import animals.Animal; 
import animals.Ape; 
import animals.Lion; 
import animals.Rat; 

public class Main { 

    public static void main(String[] args) { 
     System.out.println("Test with super........"); 
     Cage<Animal> animals = new Cage<Animal>(); 
     Cage<Lion> lions = new Cage<Lion>(); 
     animals.add(new Rat(true, 4, "Rat", true)); // OK to put a Rat into a Cage<Animal> 
     lions.add(new Lion(true, 4, "King", 9)); 
     lions.transferTo(animals); // invoke the super generic method -> animals is SUPER of lion. 
     animals.showAnimals(); 
    } 
} 

;

도트 표기법으로 "cage.set ..."을 호출하는 이유는 무엇입니까? getSet-method도 "set"정적도 아닙니다. 기술적 배경은 무엇입니까?

+0

안녕하세요 - 저의 대답은 [제네릭과 슈퍼 경계에 대한이 이전 질문] 안녕하세요 - 그건 * 내 *'transferTo' 방법입니다 (http://stackoverflow.com/questions/6826916/useful-example-with-super-and- @Bevor에서 애매한 - 확장 -에 - 당신의 코드에 살고있는 것을보고 좋은 :) – Bohemian

+0

예, 나는 당신이 새로운 질문으로 그것을 물어보기로 결심 했으므로 다른 스레드에서 내 질문을 놓친 것으로 생각 :) – Bevor

답변

2

필드 액세스 만 사용 중입니다. getSet() 메서드를 사용하면 Java 컴파일러에서 자동으로 접근 자 메서드를 사용하지 않으므로 아무런 차이가 없습니다. Cage의 코드를 포함하여 다른 Cage의 개인 회원에 액세스 할 수 있습니다 -

나는 당신이 놓치고있는 것은 private 접근이 누구의 회원이 액세스하려는 객체에 의해 결정되지 않는 것입니다 의심 set 필드.

Section 6.6 of the Java Language Specification

포함한 액세스 제어를 설명

그렇지 않으면 부재 또는 생성자 다음 액세스하는 경우 허용되고, private 선언되는 경우에만이 최상위 클래스의 신체 내에서 발생하는 경우 (§7.6) 멤버 또는 생성자의 선언을 둘러싼 다.

+0

사실 C++에서도 마찬가지입니다. –

+0

@Nicola : 감사합니다. Odd - 나는 다른 객체의 private 멤버에 액세스 할 수 있다는 사실에 놀랐던 C++ 프로그래머가 일반적으로 묻는 것을 맹세 할 수있었습니다. 대답의 그 비트를 제거합니다. –

+0

당신이 옳았습니다. 그것이 나를 혼란스럽게 만들었습니다. 하지만 지금은 나에게 분명하다고 생각합니다. – Bevor

1

구문

cage.set 

은 단순히 개체 cage 내에서 필드 set에 액세스합니다. 필드가 비공개로 선언되었지만 여전히 동일한 클래스에 속해 있습니다. Cage.

1

당신은 수업 시간에 액세스합니다. 따라서 개인 선언은 중요하지 않습니다.

메인 클래스에서 사용해보십시오. 설정이 비공개이므로 실패합니다.

1

클래스 Cage의 메서드는 같은 클래스의 전용 멤버에 액세스 할 수 있기 때문에 작동합니다. Cage. 이 경우 멤버가 클래스의 다른 인스턴스에서 액세스되는 것은 중요하지 않습니다.

관련 문제