通配符号的主要用途或目的是什么?延伸T'

时间:2011-06-08 13:19:31

标签: java generics

我对集合中使用的通用通配符表示法有一些(反直觉的)观察。 通配符List<? extends T>目的是允许List(的子类型为T)的赋值引用List的'? T'。它的目的不是要特别允许将T的子类型元素添加到List('of of T')中,即使在List<T>中也是如此。

    List<Number> list = new ArrayList<Integer>(); // invalid , List<Integer> is not assignable to List<Number>

    List<Number> list = new ArrayList<Number>() ; // OK

    list.add(new Integer(1)); // valid , '? extends Number' not needed!

    List<? extends Number> list1 = new ArrayList<Integer>();  // Valid , because of notation '? extends Number' 

我的观察是否正确?

2 个答案:

答案 0 :(得分:8)

是的,你的观察是正确的。但是,在您显示的情况下,它不是非常有用(您选择忽略有关列表的有用信息)。当你调用库函数时,赋值更有用。

例如,假设您有一个关闭InputStream集合的库函数。您可以接受List<InputStream>,但这是不必要的限制。你可以这样做:

public void closeAll(Collection<? extends InputStream> streams) {
    for ( InputStream stream : streams ) {
        stream.close();
    }
}

现在您可以传递List<FileInputStream>

答案 1 :(得分:1)

Extends用于从列表中读取,而Super用于写入列表。阅读本教程的第7页:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

在软件构建中阅读麻省理工学院课程的这些讲义:http://stellar.mit.edu/S/course/6/sp11/6.005/courseMaterial/topics/topic2/lectureNotes/Generics-spring11/Generics-spring11.pdf

希望这些可以通过通配符和泛型使一切清晰。