怎么用而不是

所以我查看了一些Java代码并偶然发现:

List l; 

基本上这个列表接受某些SomeObject – SomeObject本身或其inheritance者的所有对象。 但根据多态性,它的inheritance者也可以像SomeObject一样,所以这也可以:

 List l; 

那么,当第二个选项明确定义并且几乎相同时,为什么有人会使用第一个选项?

 List l; 

在这里你不能说List l = new ArrayList;不允许 )为…

 List l; 

你可以说

List l = new ArrayList;允许

但请注意List l = new ArrayList; List 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 someList)

那你会怎么做? 你会做的事情

  public void printList(List someList) { for(SomeObject myObj : someList) { //process read operations on myObj } 

您想要阅读的关键链接是http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html ,它详细解释了通用通配符。

ListList不一样List List 。 请注意以下事项

 List x = new ArrayList(); List y = new ArrayList(); // x = y; Will throw Compilation exception List z = y; //will pass compilation 

您可能希望观察到可以在x和y列表中添加一个字符串,但是当您编写一个库函数(例如链接中显示的示例中的printCollection)而不是接受Collection时,它将非常有用Collection在这种情况下,如果您接受Collection则用户无法将他拥有的字符串列表传递给您的方法Collection Collection然后用户可以传递他的Collection, Collection等,而不必显式创建另一个列表。

List l; 不接受new SomeObject()但是List l; 确实。

什么也行不通: List l = new ArrayList()

什么工作: List l = new ArrayList() List l = new ArrayList()

即使X可以转换为Y也不能将X添加到List

所以,在你的第二种情况下,如果List l; 被允许添加X的子类,这将打破类型安全的基本原则

作为第一个答案,

 List l; 

必须包含从SomeObjectinheritance的Object,而不是某些直接的SomeObject。