有没有办法将动物添加到笼子里? :)
public class Cage<T> extends ArrayList<T> {
public final String name = "foo";
}
public Zoo {
List<? extends Cage<?>> zooCages= new ArrayList<Cage<?>>();
public <T> void addAnimal(String name, T animal){
for(Cage<?> c : zooCages)
if(c.name.equals(name)){
c.add(animal); //compile error
return;
}
}
}
编辑:错别字。
编辑2:完成示例
最佳答案
您的问题是使用无界通配符。请参见以下示例:
Cage<?> cage1 = new Cage<Integer>();
Cage<?> cage2 = new Cage<String>();
Cage<?> cage3 = new Cage<T>();
someMethod(cage1);
someMethod(cage2);
someMethod(cage3);
public void someMethod(Cage<?> cage) {
cage.add(1); // Will not compile
cage.add("A String"); // Will not compile
cage.add(someValueOfTypeT); // Will not compile
}
从技术上讲,该方法不是严格必需的,但是您可以轻松地看到此代码的问题。
Cage<?>
可以是Cage<String>
或Cage<Anything>
。您不能添加任何东西,因为它可以是任何特定的笼子。如果要将
T
添加到Cage
,则必须是Cage<T>
或Cage<? super T>
。一种方法是:public class Zoo<T> {
private List<? extends Cage<? super T>> cages = new ArrayList<>();
public void addAnimal(String cageName, T animal) {
for(Cage<? super T> cage : cages) {
// Now you can add animal to a cage
}
}
}