gpt4 book ai didi

java - 将泛型值添加到未知类型的泛型容器

转载 作者:行者123 更新时间:2023-12-02 00:39:33 25 4
gpt4 key购买 nike

有办法将动物添加到笼子里吗? :)

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> 。您无法向其中添加任何内容,因为它可能是任何特定的 Cage。

如果您想添加TCage它必须是 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
}
}
}

关于java - 将泛型值添加到未知类型的泛型容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6756226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com