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

Bha*_*kar 7 java generics

关于集合中使用的通用通配符,我有一些(反直觉的)观察.通配符表示法的目的List<? extends T>是允许将List(子类型为T)分配给List的引用?T'.它的目的不是要特别允许将T的子类型的元素添加到List('of of T')中,即使在a中也是如此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' 
Run Code Online (Sandbox Code Playgroud)

我的观察是否正确?

Mar*_*ers 8

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

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

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

现在你可以传入一个List<FileInputStream>代替.

  • 甚至可以制作`Collection <?扩展Closeable>`,使其适用于`OutputStream等. (3认同)