2015-12-26 31 views
-1
LinkedList<String> queue = new LinkedList<String>(); // queue.peek() 
Queue<String> queue2 = new LinkedList<String>();// queue2.peek() 
List<String> queue3 = new LinkedList<String>(); // queue3.peek() error! 

我宣布在三种不同的方式链表类。我知道链表类是队列和列表接口的实现,但是当我以第三种方式声明并希望在eclipse中使用peek()方法时,为什么会出现错误?他们都是同一班?LinkedList类中没有peek()方法?

+3

你试图调用'在类型List'的'变量peek'。编译器不关心它是否引用了一个'LinkedList'。 – Tom

回答

2

是的,有在LinkedList类偷看方法。

peek() method是LinkedList类可用。由于您使用的是List类型的引用,并且List接口没有方法peek(),编译器不会允许您调用此方法。

在第一两个例子中,使用的是LinkedListQueue类型的引用,所以你能够调用peek()方法。

Why would you declare an Interface and then instantiate an object with it in Java?

+0

那么声明相同引用(接口)与不同类有什么区别?他们都有相同的方法? – sevenxuguang

+0

看到我添加的链接..我希望它有助于理解为什么我们使用接口作为参考。 –

+1

以清晰,简洁的方式解释问题,并提供相关信息的链接。 +1。我已经添加了一个答案,以类比的方式解释问题,并为维护接口实现提供了一个使用该方法的示例,对于任何感兴趣的人。 – XenoRo

-1

您在声明LinkedList为List对象。 列表接口不提供peek()方法。 这就是为什么你不能使用它。 请看这里ref

+0

请解释downvote .. – lunatikz

+0

我没有downvote,但我想这是因为你的答案不添加任何东西别人没有,只是在这个问题抛出的链接Javadoc文档列表可能不会帮助提问的人。 – Robert

+0

我不知道为什么downvote。 – sevenxuguang

-2

java.util.List 没有peek方法。当您使用LinkedList<String>创建列表,JAVA内部蒙上它作为一个List<String>等你偷看方法丢失。

您创建的三个对象是而不是与它们已被转换为不同类型的相同。

+1

该方法不会丢失。你只能直接从接口实例中调用它。 – XenoRo

+1

此外,*“当你使用一个LinkedList 创建列表,JAVA内部蒙上它作为一个列表等你偷看方法都将丢失。” *是你想要说什么措辞的非常误导的方式。 Java是***不****“内部铸造”*任何东西。该代码显式地使用'List varName = // ...'来执行*“casting”*。 – XenoRo

+0

好的,谢谢....... – sevenxuguang

2

不能从抽象接口它的一个实例调用特定的一个具体类的方法。

一个LinkedList类和List接口之间的关系就像是一个Cat类和Animal接口之间的关系:

Animal实例可以调用像.breathe().reproduce()的方法,以及这些方法的调用不同而反应该方法本身保持不变(这是接口存在的),但该接口不应该有一个方法,因为并不是所有的动物都有爪子。

在这一点上,如果你想打电话给​​的方法,你需要先问“但是,这是哪种动物?”


所以,就像你会为Cat的​​法(伪代码)...

if (animal is Cat) { 
    //remove ambiguity by defining that the (animal) is a (Cat) 
    Cat thisCat = (Cat)animal; 
    //make the cat sharpen it's claws 
    thisCat.sharpenClaws(); 
} 

...要使用LinkedList.peek()方法,你需要将它转换回更具体的类:

if (aList instanceof LinkedList) { 
    ((LinkedList)aList).peek(); 
} 
相关问题