Java 在哪里可以使用ArrayList<?扩展我的课程>;

Java 在哪里可以使用ArrayList<?扩展我的课程>;,java,generics,Java,Generics,我们在哪里可以ArrayList描述这些关键词的广泛使用的首字母缩略词是:PECS:Producer extends-consumer super 因此,如果使用“扩展”,则集合将生成给定类型的元素。所以你不能增加它,你只能从中获取 示例用法是向API的客户端提供一个列表: public List<? extends CharSequence> getFoo() { List<String> list = new ArrayList<String>()

我们在哪里可以
ArrayList描述这些关键词的广泛使用的首字母缩略词是:PECS:Producer extends-consumer super

因此,如果使用“扩展”,则集合将生成给定类型的元素。所以你不能增加它,你只能从中获取

示例用法是向API的客户端提供一个列表:

public List<? extends CharSequence> getFoo() {
    List<String> list = new ArrayList<String>();
    list.add("foo");
    return list;
}

public List您是对的,您的
ArrayList
不能按其派生方式使用:您无法将任何内容放入其中


存储My_类及其子类所需的是
ArrayList
;它将正确地获取
My_Class
的对象及其所有
DerivedClass

好吧……没有人会像这样声明ArrayList,相反,您的意图将通过编写来实现

ArrayListobj=新的ArrayList()

根据我的eXercience,我在方法参数中看到了这个概念,您希望调用方提供特定超类型的子类型集合(或者像上面所说的那样从方法返回)。如下

public getAnimals(List< ? extends Animal> obj){

obj.add(something);    //not allowed

}
publicGetAnimals(列表<?扩展动物>obj){
obj.add(某物);//不允许
}
你很有可能会把驴、猴子和鸟等添加到你的特定类型的列表中,比如说(猴子)。从中获取classCastException


这就是为什么在这种情况下是不允许的。阅读Josh Bloch的有效Java。他用生产者消费者类比法(PECS)很好地解释了这一点。

Ahm。。。什么?是的,这正是我在某些情况下想要的。假设驴、猴子和鸟都来自动物,那么。。。将它们存储在
阵列列表中有什么问题??而且。。。潜在的灾难在哪里?我不认为自己会如此愚蠢。很抱歉..请参考更新的回答我们试图从中获得的好处是什么我不理解,因为此方法的调用方还应该定义一个类型为ListReplicate的变量
public getAnimals(List< ? extends Animal> obj){

obj.add(something);    //not allowed

}