首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建LinkedList

创建LinkedList
EN

Stack Overflow用户
提问于 2014-10-24 12:34:20
回答 3查看 78关注 0票数 0

如果我创建这样一个LinkedList

代码语言:javascript
复制
LinkedList<Integer> Mistery = new LinkedList<>();

实现这一点是可能的:Mistery.getFirst();

另一方面,如果我创建了这样一个LinkedList:

代码语言:javascript
复制
List<Integer> Mistery = new LinkedList<>();

不可能在getFirst()列表上实现Mistery方法。

为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-24 12:40:59

代码语言:javascript
复制
List<Integer> Mistery = new LinkedList<>();

通过这样声明变量,您可以告诉编译器:我想使用List。我想要的列表的实现是LinkedList,但是其他代码不应该知道这一点。它只需要知道这是一份清单。稍后我可能会改变主意,使用一个ArrayList,其余的代码仍然会编译,因为ArrayList也是一个列表。我还可以将另一个对象分配给同一个变量,这个对象可能是ArrayList、CopyOnWriteArrayList或任何其他类型的List。

因为List没有getFirst()方法,所以不能使用它:变量是List类型,而不是LinkedList类型。当然,在运行时,对象是LinkedList类型的。但是编译器只知道变量的类型。它在运行时不知道它的具体类型。

附带注意: Java变量应该以小写字母开头,以尊重标准约定。

票数 3
EN

Stack Overflow用户

发布于 2014-10-24 12:38:03

因为您将Mistery声明为超级类型:List (虽然您选择了LinkedList作为实现),所以在List接口中,没有定义getFirst()方法。

票数 3
EN

Stack Overflow用户

发布于 2014-10-24 13:00:29

需要考虑的也是为什么要使用List。(答案已经说明了为什么List没有getFirst()方法)。

假设您有一个打印列表内容的方法:

代码语言:javascript
复制
public printStuff(List list){
   for(Object element: list){
       System.out.println(element);}

通过声明一个列表,这意味着您可以(通过polymorphism)对一系列列表使用一种方法,即

代码语言:javascript
复制
List<Integer> Mistery = new LinkedList<>();
List<Integer> Mistery2 = new ArrayList<>();
List<String> Mistery3 = new ArrayList<>();
//etc

然后你就可以这样做:

代码语言:javascript
复制
printStuff(Mistery);
printStuff(Mistery2);
printStuff(Mistery3); //can even print out a List which contains Strings

如果列表声明为LinkedList<Integer> Mistery = new LinkedList<>();,则可以而不是使用printStuff方法。您还应该阅读铸造

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26547980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档