Java通用通配符扩展

Java通用通配符扩展,java,generics,extends,bounded-wildcard,Java,Generics,Extends,Bounded Wildcard,为什么我不能向这种类型的列表中添加整数,即使整数扩展了Number> List<? extends Number> numList = new ArrayList<Integer>(); Integer f = 12; numList.add(f); List若要向列表中添加元素,则需要使用super关键字 List<? super Integer> numList = new ArrayList<Integer>(); 看看PECS原理。

为什么我不能向这种类型的列表中添加整数,即使整数扩展了Number>

List<? extends Number> numList = new ArrayList<Integer>(); 
Integer f = 12;
numList.add(f);

List若要向列表中添加元素,则需要使用super关键字

List<? super Integer> numList = new ArrayList<Integer>(); 
看看PECS原理。相关报价:

您想向收藏中添加内容。

那么列表就是消费者,因此您应该使用
集合如果您想存储任何类型的数字,您只需执行以下操作:

List<Number> numList = new ArrayList<Number>();
List numList=new ArrayList();

该列表可以定义为列表,也可以列出其他类型,在这种情况下,编译器不允许将整数存储到列表中:这将在类型安全功能中产生问题

如果你需要,你可以用这个

List<Number> numList = new ArrayList<Number>();
        Integer f = 100;
        numList.add(f);
List numList=new ArrayList();
整数f=100;
增加(f)项;

通配符是否仅用于读取和使用,而不用于编辑和添加?因为列表可以是列表,也可以是列表,并且您不希望将整数存储到列表中:这会破坏泛型的类型安全性。如果我不能添加到双精度或双精度十进制的列表中,该列表怎么可能呢?这将有助于回答您的问题<代码>列表这相当于
列表
,它丢弃了类型安全性。@JimGarrison不,这仍然是类型安全的。它提供编译时类型检查,以确保添加到列表中的任何内容都是
编号,我的问题都是关于生产者-消费者的。@nbrook添加时可能是类型安全的,但是当您检索元素时,需要显式强制转换来调用元素上的
对象
方法以外的方法。@JimGarrison在这种情况下,列表被视为消费者——您将数据推入其中,而不是从中读取数据。在使用此范例的方法中,它不关心从列表中检索数据,因此它使用有界通配符来抽象数据。这相当于
list
,并放弃类型安全性。从列表中检索元素时,如果没有显式强制转换,您将无法调用
Number
Integer
中的方法。@JimGarrison这是一个简化的示例,因此从这段代码中看,这可能有用的用例并不明显。使用
时的意图是什么?超级类型(super-Type)
范例是不从列表中检索类型化数据。引用我链接的帖子:“如果你只是从一个普通收藏中提取物品,那么它是制作人,你应该使用
extends
;如果你只是在收藏物品,那么它是消费者,你应该使用
super
。如果你对同一个收藏都使用
extends
super
。”
List<Number> numList = new ArrayList<Number>();
List<Number> numList = new ArrayList<Number>();
        Integer f = 100;
        numList.add(f);