LinkedList类中没有peek()方法?

时间:2015-12-26 14:34:51

标签: java list linked-list declaration

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!

我以三种不同的方式声明了linklist类。我知道linkedlist类是队列和列表接口的实现,但是当我以第三种方式声明并想在eclipse中使用peek()方法时,为什么会出现错误?他们都是同一个班级?

4 个答案:

答案 0 :(得分:2)

是的,在LinkedList类中有一个peek方法。

LinkedList类中提供了

peek() method。由于您使用的是List类型的引用,而List接口没有方法peek(),因此编译器不允许您调用它。

在前两个示例中,您使用的是LinkedListQueue类型的引用,因此您可以调用peek()方法。

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

答案 1 :(得分:2)

您无法从 抽象界面 具体类 的方法>对它。

LinkedList类和List接口之间的关系类似于Cat类和Animal接口之间的关系:

Animal的实例可以调用.breathe().reproduce()之类的方法,并以不同的方式响应对这些方法的调用,而方法本身保持不变(这就是存在的接口),但界面不应该有.sharpenClaws()方法,因为并非所有动物都有爪子。

此时,如果你想调用.sharpenClaws()方法,你需要首先询问&#34;但是,这是哪种动物?&#34;

所以,就像你对Cat .sharpenClaws()方法(伪代码)所做的那样......

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的{​​{1}}方法,您需要将其强制转换回更具体的类:

.peek()

答案 2 :(得分:-1)

您将LinkedList声明为List对象。 List接口不提供peek()方法。 这就是为什么你不能使用它。 见ref

答案 3 :(得分:-2)

java.util.List 没有偷看的方法。当您使用LinkedList<String>创建列表时,java会在内部将其强制转换为List<String>,因此您的查看方法将丢失。

您创建的三个对象与它们已投放到不同类型的对象相同。