【发布时间】:2011-07-26 07:53:13
【问题描述】:
我知道有很多关于这个话题的问题,但不幸的是他们无法帮助我消除我的晦涩难懂。首先,看下面的例子。我不明白,为什么以下“添加”方法 someCage.add(rat1) 不起作用并中止,但出现以下异常:
线程“主”java.lang.Error 中的异常:未解决的编译 问题:类型中的方法 add(capture#2-of ? extends Animal) 笼子不适用于 论据(大鼠)
这与Cage<Rat> 不是Cage<Animal> 的原因相同吗?如果是的话,我在这个例子中不明白,所以我不确定编译器到底做了什么。下面是代码示例:
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) {
Lion lion1 = new Lion(true, 4, "Lion King", 8);
Lion lion2 = new Lion(true, 4, "King of Animals", 9);
Ape ape1 = new Ape(true, 2, "Gimpanse", true);
Ape ape2 = new Ape(true, 2, "Orang Utan", true);
Rat rat1 = new Rat(true, 4, "RatBoy", true);
Rat rat2 = new Rat(true, 4, "RatGirl", true);
Rat rat3 = new Rat(true, 4, "RatChild", true);
Cage<Animal> animalCage = new Cage<Animal>();
animalCage.add(rat2);
animalCage.add(lion2);
Cage<Rat> ratCage = new Cage<Rat>();
ratCage.add(rat3);
ratCage.add(rat1);
ratCage.add(rat2);
// ratCage.add(lion1); //Not Possible. A Lion is no rat
Cage<Lion> lionCage = new Cage<Lion>();
lionCage.add(lion2);
lionCage.add(lion1);
Cage<? extends Animal> someCage = new Cage<Animal>(); //? = "unknown type that is a subtype of Animal, possibly Animal itself"
someCage = ratCage; //OK
// someCage = animalCage; //OK
someCage.add(rat1); //Not Possible, but why?
animalCage.showAnimals();
System.out.println("\nRatCage........");
ratCage.showAnimals();
System.out.println("\nLionCage........");
lionCage.showAnimals();
System.out.println("\nSomeCage........");
someCage.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> cage = new HashSet<T>();
public void add(T animal) {
cage.add(animal);
}
public void showAnimals() {
for (T animal : cage) {
System.out.println(animal.getName());
}
}
}
此外,如果您能给我一个带有此动物笼子代码的有意义的“超级”示例,我会很高兴。直到现在我还不明白如何使用它。有很多理论示例,我阅读了有关 PECS 概念的信息,但无论如何我还不能在有意义的事情上使用它。在这个例子中,有一个“消费者”(带有超级用户)意味着什么?
【问题讨论】: