我正在阅读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。我们也不需要施展它吗?
答案 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)