java Queue接口多态性

时间:2012-08-20 17:17:01

标签: java interface queue polymorphism

我正在阅读http://www.docjar.com/html/api/java/util/LinkedList.java.html

在Java中声明队列时

    Queue<Integer> queue = new LinkedList<Integer>();

幕后会发生什么?因为我看到队列是一个只有方法签名的接口,而LinkedList没有直接实现它,所以它如何覆盖这些方法(add()peek()poll(),{{1 }和offer())并做这样的多态?我的意思是您只能访问某些特定方法,但并非所有方法都来自remove(),例如LinkedList不再可用,因为它会将明显类型设置为Queue。我们也不需要施展它吗?

4 个答案:

答案 0 :(得分:5)

从JDK的源代码:

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{

所以LinkedList<E>没有直接实现Queue<E>,但它确实实现了Deque<E>,扩展了Queue<E>

public interface Deque<E> extends Queue<E> {

因此,LinkedList<E>继承了Queue<E>的抽象方法。

覆盖方法直接在LinkedList<E>中定义 - 像往常一样。

答案 1 :(得分:2)

  

因为我看到队列是一个只有方法签名的接口,而LinkedList没有直接实现它

LinkedList确实实现了一个队列:http://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html

答案 2 :(得分:0)

LinkedList does implement Queue。使用接口声明对象时,编译器仅将其视为该类型的对象。但是,由于无法实例化接口,因此需要将其实例化为实现该接口的类。在这种情况下,您将无法访问某些LinkedList方法,例如(push()pop()),因为编译器会将queue标识为Queue<Integer>。但是,因为它被实例化为LinkedList<Integer>,并且可以轻松地转换为LinkedList

答案 3 :(得分:0)