2011-08-07 9 views
2

私は次の例があります呼び出しゲッターのないフィールドにアクセスするのはなぜですか?

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(); 
    } 
} 

;

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); 
    } 
} 

メインクラス

私はgetSetメソッドも静的な "set"も持っていませんが、ドット表記で "cage.set ..."を呼び出すのはなぜですか?技術的背景は何ですか?

+0

ちょっと - それは私の答えからの[私の* 'transferTo'メソッドです[このジェネリックとスーパーバウンディングについてのこの前の質問](http://stackoverflow.com/questions/6826916/useful-example-with-super-and- @Bevorからのジェネリックでの曖昧さ) - あなたのコードでそれが生き生きとしているのを見てうれしく思います:) – Bohemian

+0

はい、あなたは私の質問を他のスレッドで逃したと思っていましたので、私はそれを新しい質問として尋ねました。 ) – Bevor

答えて

2

あなたはフィールドアクセスを使用しています。 getSet()メソッドを使用すると、Javaコンパイラは自動的にアクセサメソッドを使用しないため、違いはありません。私はあなたが欠けているものを疑う

privateアクセスがそのメンバーアクセスしようとしているオブジェクトによって決定されていないということです - Cage内のコードは、他のCageのプライベートメンバーへのアクセスを持っている、など、 setフィールド。

Section 6.6 of the Java Language Specification

には、アクセス制御を説明:

そうでない場合には、部材又はコンストラクタは、アクセスがあれば許可され、privateを宣言されている場合にのみ、それはトップレベルクラスの本体内で発生した場合(7.6)メンバーまたはコンストラクターの宣言を囲む。

+0

実際にはC++でも同じです。 –

+0

@ニコラ:ありがとう。奇妙なことに、私は、他のオブジェクトのプライベートメンバーにアクセスできることに驚いているC++プログラマーから、これが普通に頼まれていると誓っていました。その答えのビットを削除します。 –

+0

あなたは正しかった、それは私を混乱させるものでした。しかし、今私には明らかだと思います。 – Bevor

1

構文

cage.set 

は、単にあなたのオブジェクトcage内のフィールドsetにアクセスしています。フィールドはプライベートと宣言されていますが、あなたはまだ同じクラスに入っていますCage

1

あなたはクラス内からアクセスします。したがって、私的宣言はカウントされません。

メインクラスから試してみましょう。セットはプライベートなので、失敗します。

1

クラスCageのメソッドは同じクラスのプライベートメンバーにアクセスできるため、これは機能しますCage。この場合、メンバーがクラスの別のインスタンスでアクセスされることはここでは重要ではありません。

関連する問題