java - 实现队列,使其通用时出现错误

标签 java generics object queue

我对 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 的建议时,出现空指针异常,并且当我保留通用代码时,它无法编译。

最佳答案

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

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));
    }

}

关于java - 实现队列,使其通用时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16826326/

相关文章:

java - 视频聊天应用程序

java - 为什么 Android 允许使用更具体的参数类型进行覆盖?

java - 字符串分析与分类

java - 一个变量减少而另一个变量增加

C# - 没有从 'T' 到 'System.IComparable<T>' 的隐式引用转换

java - 难以理解类对象和构造函数

javascript - 如何在javascript中将字符串转换为对象数组

java - 向接口(interface)方法添加额外的类型参数可防止覆盖

java - 方法提取、泛型、反射

javascript - 在已存在的对象内创建对象数组