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()方法时,为什么会出现错误?他们都是同一个班级?
答案 0 :(得分:2)
是的,在LinkedList类中有一个peek方法。
LinkedList类中提供了 peek()
method。由于您使用的是List类型的引用,而List接口没有方法peek()
,因此编译器不允许您调用它。
在前两个示例中,您使用的是LinkedList和Queue类型的引用,因此您可以调用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>
,因此您的查看方法将丢失。
您创建的三个对象不与它们已投放到不同类型的对象相同。