如何在另一个类中使用Queue.java

时间:2015-03-03 07:37:23

标签: java queue

import java.util.Arrays;

public class Queue <T>{
    private T[] QueueArr;
    private int front; 
    private int back;
    private int size; 

    public Queue(){}

    @SuppressWarnings("unchecked")
    public Queue (int size)
    { 
        if (size <= 0)
            throw new IllegalArgumentException("Size cannot be less than or equal to 0!");
        this.size = size;
        QueueArr = (T[]) new Object[size];
        front = -1;
        back = -1;
    }

    public boolean isEmpty ()
    {
        if (front == -1 &&back == -1)
            return true;
        else 
            return false;
    }

    public boolean isFull()
    {
    return (back +1) % size == front;
    }

    public void enQueue ( T ele)
    {
        if (isFull())
            throw new IllegalStateException ("The Queue is full!");
        else if (isEmpty())
        {
            front++;
            back++;
        }
        else
        {
            back +=1;
        }
        QueueArr[back] = ele;
    }

    public void deQueue()
    {
        if (isEmpty())
            throw new IllegalStateException("Can't dequeue an empty queue!");
        else if (front == back)
        {
            front =-1;
            back = -1;
        }
        else
        {
            front = (front + 1) % size;
        }
    }   
    public T Front()
    {
        if(front == -1)
        {
            throw new IllegalStateException("Can't return from an empty queue!");
        }                   
        return QueueArr[front];
    }

    @Override
    public String toString()
    {
        return ("front is " + front + ", back is " + back +", size is " + size + "Queue is " + Arrays.toString(QueueArr));
    }   
}

我使用循环数组算法实现了Queue数据结构,我试图在另一个类中实现这个Queue类。

例如:公共类库存{}

会是这样的:

public class Inventory extends Queue{}

我收到警告&#34;队列是原始类型。对泛型类型Queue的引用应该参数化&#34;当我在上面这一行时。

我是Java的初学者。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在重复使用课程之前,您需要问自己,is Inventoty a queueinventory has a queue?可以理解,您将知道库存是否需要扩展队列,或者是否具有类型为队列的字段。

您需要问自己回答这个问题的一些问题:

  1. 您是否要在广告资源上使用所有队列的方法,包括front()enqueue()dequeue()
  2. 您是否希望以后能够重复使用Inventory来支持非Queue的数据(可能Stack?) - has-a关系通常更容易重构。
  3. 您是否希望能够将Inventory传递给接受Queue作为参数的方法?

  4. 如果库存是一个队列(我不相信你想要的),你确实需要扩展它:

    public class Inventory <T> extends Queue<T>{}
    

    或者如果Inventory在队列中只有一种类型的元素(让它为Item):

    public class Inventory extends Queue<Item>{}
    

    但是,如果更可能的情况和库存有一个队列,则需要在库存中分配一个类型为Queue的字段:

    public class Inventory <T> {
         private Queue<T> queue;
    }
    

    或再次,如果它只有一种类型的项目:

    public class Inventory {
         private Queue<Item> queue;
    }
    

答案 1 :(得分:0)

您的Queue是参数化类。 Java警告你,扩展它的类(在你的情况下为Inventory)也应该参数化:

public class Inventory <T> extends Queue<T> {
    // ...
}