用法?扩展Java Generics中的任何对象

时间:2018-03-28 03:28:17

标签: java generics

    List<? extends Number> l = new ArrayList<Integer>();

我有上面的代码行。 对象&#39; l&#39;可以引用任何可以为其任何子类型的对象。 我知道我们不能在上面的列表中添加任何内容。 那么&#34;的用途是什么?扩展any_object&#34;既然我们不能添加任何东西呢? 在什么样的背景下使用它? 任何人都可以解释一下。

谢谢!

2 个答案:

答案 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 )。