正在创建LinkedList



如果我创建这样的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。你还应该阅读选角方面的知识。

相关内容

  • 没有找到相关文章

最新更新