为什么没有吸气剂就能进入一个场?

时间:2011-08-07 07:51:24

标签: java generics hashset

我有以下示例:

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

主要课程:

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.addAll(this.set);

为什么用点符号调用“cage.set ...”是有效的,我既没有getSet方法,也没有“set”静态?什么是技术背景?

4 个答案:

答案 0 :(得分:2)

您只是使用字段访问权限。使用getSet()方法没有区别,因为Java编译器不会自动为您使用访问器方法。

我怀疑您遗失的是private访问权限不是由您尝试访问其成员的对象决定的 - Cage中的代码已包含访问任何其他Cage的私人成员,包括set字段。

Section 6.6 of the Java Language Specification描述了访问控制,包括:

  

否则,如果成员或构造函数声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

答案 1 :(得分:1)

语法

cage.set

只是访问对象set中的字段cage。该字段被声明为私有,但您仍在同一个类Cage内。

答案 2 :(得分:1)

您可以从班级内部访问它。所以私人声明不计算在内。

从您的Main类中尝试它会失败,因为set是私有的。

答案 3 :(得分:1)

这很有效,因为类Cage中的方法可以访问同一个类Cage中的私有成员。这里的成员在该类的另一个实例上被访问并不重要。