1

我对这个 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 的建议时,我得到一个空指针异常,并且当我保留通用代码时,它不会编译。

4

1 回答 1

1

我认为您没有正确使用泛型,所以我修改了您的课程。请检查它是否适合您.....
更新:我已经稍微更改了代码以实例化arr[]数组。在底部main方法和一个constructor已添加。

import java.util.AbstractQueue;
import java.util.Iterator;

public class MyQueue<T> extends AbstractQueue<T> {

    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<T> iterator() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return 0;
    }

    public static void main(String[] args) {
        MyQueue<Integer> realQueue = new MyQueue<Integer>(Integer[].class, 10);
        System.out.println(realQueue.offer(20));
    }
    public MyQueue(Class<T[]> clazz, int length) {
        arr = clazz.cast(Array.newInstance(clazz.getComponentType(), length));
    }

}
于 2013-05-30T01:21:31.980 回答