怎么用而不是
所以我查看了一些Java代码并偶然发现:
List l;
基本上这个列表接受某些SomeObject – SomeObject本身或其inheritance者的所有对象。 但根据多态性,它的inheritance者也可以像SomeObject一样,所以这也可以:
List l;
那么,当第二个选项明确定义并且几乎相同时,为什么有人会使用第一个选项?
List l;
在这里你不能说List
( 不允许 )为…
List extends SomeObject> l;
你可以说
List extends SomeObject> l = new ArrayList
( 允许 )
但请注意List extends SomeObject> l = new ArrayList
List extends SomeObject> l = new ArrayList
你不能在列表中添加任何东西l因为? 代表未知类( 当然无效 )。
更新:对于您在评论中的问题What could I possibly do with a list if I cannot add anything to it?
现在考虑一种情况,你必须编写一个函数来打印你的列表,但请注意,它必须只接受一个List,它包含SomeObject的子类 。 在这种情况下,如上所述,你不能使用
public void printList(List
那你会怎么做? 你会做的事情
public void printList(List extends SomeObject> someList) { for(SomeObject myObj : someList) { //process read operations on myObj }
您想要阅读的关键链接是http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html ,它详细解释了通用通配符。
List
与List extends SomeObject>
不一样List extends SomeObject>
List extends SomeObject>
。 请注意以下事项
List
您可能希望观察到可以在x和y列表中添加一个字符串,但是当您编写一个库函数(例如链接中显示的示例中的printCollection)而不是接受Collection
时,它将非常有用Collection
在这种情况下,如果您接受Collection extends Object>
则用户无法将他拥有的字符串列表传递给您的方法Collection extends Object>
Collection extends Object>
然后用户可以传递他的Collection
等,而不必显式创建另一个列表。
List extends SomeObject> l;
不接受new SomeObject()
但是List
确实。
什么也行不通: List
什么工作: List extends SomeObject> l = new ArrayList
List extends SomeObject> l = new ArrayList
即使X
可以转换为Y
也不能将X
添加到List
。
所以,在你的第二种情况下,如果List
被允许添加X的子类,这将打破类型安全的基本原则
作为第一个答案,
List extends SomeObject> l;
必须包含从SomeObjectinheritance的Object,而不是某些直接的SomeObject。