List<? extends Number> l = new ArrayList<Integer>();
我有上面的代码行。 对象&#39; l&#39;可以引用任何可以为其任何子类型的对象。 我知道我们不能在上面的列表中添加任何内容。 那么&#34;的用途是什么?扩展any_object&#34;既然我们不能添加任何东西呢? 在什么样的背景下使用它? 任何人都可以解释一下。
谢谢!
答案 0 :(得分:4)
它对方法参数最有用。考虑一下:
public void printFormatted(Collection<? extends Number> values) {
NumberFormat format = new DecimalFormat("0.000");
for (Number value : values) {
System.out.println(format.format(value));
}
}
如果我使用Collection<Number>
声明方法,则调用者必须传递其通用类型已知为Number的Collection(或List或Set)。他们无法传递Collection<Integer>
,因为收集&lt;整数&gt;不是Collection&lt; Number&gt;的子类实际上与Collection&lt; Number&gt;不具有多态兼容性。
通过使用Collection<? extends Number>
声明方法,我说调用者可以传递Collection&lt; Number&gt;,Collection&lt; Integer&gt;或Collection&lt; Double&gt;等.List&lt; Integer&gt;或者设置&lt;整数&gt;也是可以接受的,因为类是多态的,即使泛型不是。
答案 1 :(得分:1)
可能的一个例子:
当您传递此方法作为参数时,您可以迭代此类列表的元素并使用适合Number
类的方法。您需要注意,您不能添加任何元素到此列表中。您可以使用list.get()
方法,这样,您就可以确保获得 instanceof Number
类。
这样的列表然后被称为 producer 。如果您需要添加元素列表,而不是检索它们,则可以使用<? super Number>
。该规则称为PECS( Producer Extends Consumer Super )。