通配符号的主要用途或目的是什么? 扩展T’
我有一些关于集合中使用的通用通配符的(反直觉)观察。 通配符List
的目的 List
List
是允许将List(T的子类型) 赋值给’?List’的引用? T’。 其目的不是特别允许将T的子类型元素添加到List(’of of T’)中,即使在List
。
List list = new ArrayList(); // invalid , List is not assignable to List List list = new ArrayList() ; // OK list.add(new Integer(1)); // valid , '? extends Number' not needed! List list1 = new ArrayList(); // Valid , because of notation '? extends Number'
我的观察是否正确?
是的,你的观察是正确的。 但是,在您显示的情况下,它不是非常有用(您选择忽略有关列表的有用信息)。 当调用库函数时,赋值更有用。
例如,假设您有一个关闭InputStream集合的库函数。 您可以接受List
,但这是不必要的限制。 你可以这样做:
public void closeAll(Collection extends InputStream> streams) { for ( InputStream stream : streams ) { stream.close(); } }
现在,您可以传入List
。
Extends用于从列表中读取,而Super用于写入列表。 阅读本教程的第7页: http : //java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
阅读MIT课程中的软件构建讲义: http : //stellar.mit.edu/S/course/6/sp11/6.005/courseMaterial/topics/topic2/lectureNotes/Generics-spring11/Generics-spring11.pdf
希望这些将通过通配符和generics使一切清晰。