我有以下示例:
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”静态?什么是技术背景?
答案 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
中的私有成员。这里的成员在该类的另一个实例上被访问并不重要。