如果我创建这样的LinkedList
:
LinkedList<Integer> Mistery = new LinkedList<>();
可以实现:Mistery.getFirst();
另一方面,如果我创建这样的LinkedList:
List<Integer> Mistery = new LinkedList<>();
无法在Mistery
列表上实现getFirst()
方法。
为什么?
List<Integer> Mistery = new LinkedList<>();
通过以这种方式声明变量,您告诉编译器:我想使用List。我想要的List的实现是LinkedList,但代码的其余部分不应该知道这一点。它只需要知道这是一个列表。稍后我可能会改变主意,使用ArrayList,其余代码仍将编译,因为ArrayList也是List。我也可以将另一个对象分配给同一个变量,这个对象的类型可能是ArrayList、CopyOnWriteArrayList或任何其他类型的List。
由于List没有getFirst()
方法,因此不能使用它:变量的类型是List,而不是LinkedList。在运行时,对象的类型肯定是LinkedList。但是编译器只知道变量的类型。它在运行时不知道它的具体类型。
附带说明:Java变量应该以小写字母开头,以遵守标准约定。
因为您将Mistery
声明为超类型:List
(尽管您选择了LinkedList
作为实现),所以在List
接口中,没有定义getFirst()
方法。
需要考虑的问题也是您想要使用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
如果List是这样声明的LinkedList<Integer> Mistery = new LinkedList<>();
,则可以不使用方法printStuff
。你还应该阅读选角方面的知识。