如果我创建这样一个LinkedList:
LinkedList<Integer> Mistery = new LinkedList<>();实现这一点是可能的:Mistery.getFirst();
另一方面,如果我创建了这样一个LinkedList:
List<Integer> Mistery = new LinkedList<>();不可能在getFirst()列表上实现Mistery方法。
为什么?
发布于 2014-10-24 12:40:59
List<Integer> Mistery = new LinkedList<>();通过这样声明变量,您可以告诉编译器:我想使用List。我想要的列表的实现是LinkedList,但是其他代码不应该知道这一点。它只需要知道这是一份清单。稍后我可能会改变主意,使用一个ArrayList,其余的代码仍然会编译,因为ArrayList也是一个列表。我还可以将另一个对象分配给同一个变量,这个对象可能是ArrayList、CopyOnWriteArrayList或任何其他类型的List。
因为List没有getFirst()方法,所以不能使用它:变量是List类型,而不是LinkedList类型。当然,在运行时,对象是LinkedList类型的。但是编译器只知道变量的类型。它在运行时不知道它的具体类型。
附带注意: Java变量应该以小写字母开头,以尊重标准约定。
发布于 2014-10-24 12:38:03
因为您将Mistery声明为超级类型:List (虽然您选择了LinkedList作为实现),所以在List接口中,没有定义getFirst()方法。
发布于 2014-10-24 13:00:29
需要考虑的也是为什么要使用List。(答案已经说明了为什么List没有getFirst()方法)。
假设您有一个打印列表内容的方法:
public printStuff(List list){
for(Object element: list){
System.out.println(element);}通过声明一个列表,这意味着您可以(通过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方法。您还应该阅读铸造。
https://stackoverflow.com/questions/26547980
复制相似问题