将泛型值添加到未知类型的泛型容器
有没有办法将动物添加到笼子里? :)
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:完成示例
is there a way to add the animal to the cage? :)
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;
}
}
}
EDIT: Typos.
EDIT 2 : complete the example
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的问题在于使用无界通配符。请参阅以下示例:
从技术上讲,该方法并不是绝对必要的,但您可以轻松地看到此代码的问题。
Cage
可以是Cage
或Cage
。您无法向其中添加任何内容,因为它可以是任何特定的 Cage。如果您想将
T
添加到Cage
,它必须是Cage
还是Cage<?超级T>
。您可以执行此操作的一种方法是:Your problem is with the use of unbounded wildcards. See the following example:
Technically, the method wasn't strictly necessary, but you can easily see the problem with this code. A
Cage<?>
can be aCage<String>
or aCage<Anything>
. You can't add anything to it because it could be any specific Cage.If you want to add
T
to aCage
it has to be aCage<T>
or aCage<? super T>
. One way you can do this is:(我假设 Cage 是一个集合。)
这里有一个概念错误。
c
在 foreach 循环中被声明为Cage
,即接受未指定类型的笼子。您尝试向其中添加一个T
类型的对象,但没有理由相信c
可以包含T
类型的对象。请参阅 http://download.oracle.com/javase/tutorial/java/ generics/wildcards.html 了解通配符
*
含义的详细信息。您可能希望类中的所有笼子都包含相同的(任意)类型
T
。在这种情况下,整个封闭类应该采用类型参数。例如:(I'm assuming
Cage
is a collection.)You have a conceptual error here.
c
is declared in the foreach loop as aCage<?>
, i.e. a cage that accepts an unspecified type. You are trying to add an object of typeT
to it, but there's no reason to believe thatc
can contain objects of typeT
.See http://download.oracle.com/javase/tutorial/java/generics/wildcards.html for details on what the wildcard
*
means.You probably wanted all the cages in the class to contain the same (arbitrary) type
T
. In this case, the entire enclosing class should take a type parameter. For example: