【发布时间】:2013-05-30 01:02:25
【问题描述】:
我对 AbstractQueue 的这个实现做错了什么感到困惑。
此代码是导致错误的原因:
public static void main(String[] args) {
Stack<Integer> intStack = new Stack();
MyQueue<Integer> realQueue = new MyQueue();
PriorityQueue<Integer> intQueue = new PriorityQueue();
}
Eclipse 说我需要从 MyQueue 中删除通用类型。
这是实现的类:
import java.util.AbstractQueue;
import java.util.Iterator;
public class MyQueue extends AbstractQueue<Object> {
private T[] arr;
private int headPos;
private int tailPos;
private int size = 0;
@Override
public boolean offer(T e) {
if (size < arr.length)
size++;
else if (headPos == tailPos)
headPos = nextPos(headPos);
arr[tailPos] = e;
tailPos = nextPos(tailPos);
return true;
}
private int nextPos(int pos) {
return (pos + 1) % arr.length;
}
@Override
public T peek() {
if (size == 0)
return null;
return arr[headPos];
}
@Override
public T poll() {
if (size == 0)
return null;
size--;
T res = arr[headPos];
headPos = nextPos(headPos);
return res;
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public int size() {
return size;
}
}
这是我第一次实现队列,也是我第一次创建一个使用泛型的类,所以我完全不知道该怎么做。当我遵循 Eclipse 的建议时,我得到一个空指针异常,并且当我将通用代码留在其中时,它无法编译。
【问题讨论】:
-
你在扩展 AbstractQueue
-
你应该声明你的班级
public class MyQueue<T> extends AbstractQueue<T>。 -
^ 并将所有
Object替换为T -
改变了这一点,当我尝试向队列中添加一些东西时仍然给我一个空指针异常。
-
你的类声明应该是
public class MyQueue<T> extends AbstractQueue<T>。您的变量声明需要在 RHS 上指定通用参数类型 -Stack<Integer> intStack = new Stack<Integer>();。你的 NPE 来自代码中的其他地方。
标签: java generics object queue