[英]Creating a LinkedList
如果我这样创建一个LinkedList
:
LinkedList<Integer> Mistery = new LinkedList<>();
可以实现这一点: Mistery.getFirst();
另一方面,如果我创建这样的LinkedList:
List<Integer> Mistery = new LinkedList<>();
在Mistery
列表上将无法实现getFirst()
方法。
为什么?
因为您将Mistery
声明为超级类型: List
(尽管您选择了LinkedList
作为实现),所以在List
接口中没有定义getFirst()
方法。
List<Integer> Mistery = new LinkedList<>();
通过以这种方式声明变量,您就是在告诉编译器:我要使用List。 我想要的列表的实现是LinkedList,但是其余代码不应该知道这一点。 它所需要知道的就是它是一个列表。 稍后我可能会改变主意并使用ArrayList,并且其余代码仍将编译,因为ArrayList也是一个List。 我还可以将另一个对象分配给相同的变量,并且该对象的类型可以是ArrayList或CopyOnWriteArrayList或任何其他类型的List。
由于List没有getFirst()
方法,因此您无法使用它:变量的类型为List,而不是LinkedList。 在运行时,请确保该对象的类型为LinkedList。 但是编译器只知道变量的类型。 它在运行时不知道其具体类型。
旁注:Java变量应以小写字母开头,以遵守标准约定。
还有一些要考虑的原因也是您为什么要使用List的原因。 (答案已经涵盖了为什么List
没有getFirst()方法)。
假设您有一种打印列表内容的方法:
public printStuff(List list){
for(Object element: list){
System.out.println(element);}
通过将您的Mistery列表声明为List,这意味着您可以(通过polymorphism
)对列表范围使用单一方法,即
List<Integer> Mistery = new LinkedList<>();
List<Integer> Mistery2 = new ArrayList<>();
List<String> Mistery3 = new ArrayList<>();
//etc
然后,您可以执行以下操作:
printStuff(Mistery);
printStuff(Mistery2);
printStuff(Mistery3); //can even print out a List which contains Strings
如果列表是这样声明的LinkedList<Integer> Mistery = new LinkedList<>();
您不能使用方法printStuff
。 您还应该阅读有关铸造的内容 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.