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