【问题标题】:Implementation of Queue<E> interface [duplicate]Queue<E> 接口的实现
【发布时间】:2014-04-29 07:53:02
【问题描述】:

我无法理解泛型、接口和数组的细微差别以及如何一起使用它们。我有一个中间 Java 类的任务。作业如下:

  • 创建一个实现 Queue 的泛型类 SimpleQueue
  • 使用构造函数初始化一个有 5 个槽的数组。
  • 不允许使用 ArrayList
  • 如果数组被填满,我们必须能够增加它的大小

我遇到的问题是数组的初始化。这是我的代码:

import java.util.Collection;
import java.util.Iterator;
import java.util.Queue;

public class SimpleQueue<E> implements Queue<E>{

    private E myQueue[];

    //Constructor with no arguments.
    public SimpleQueue() {
        myQueue = new [5];
        System.out.println("A queue with length " + myQueue.length + " was created.");
    }
}

Eclipse 抱怨说我们不能创建一个通用数组。我已经设法通过这样做来让它工作:

private Object myQueue[] = Object[5];

...但我觉得这违背了使用泛型的目的。我误解了泛型的使用吗?指针将不胜感激!

这是我在工作时用来测试我的泛型类的代码:

public class SimpleQueueTester {

    public static void main(String [] args) {
        SimpleQueue<String> myStringQueue = new SimpleQueue<>();
        SimpleQueue<Integer> myIntegerQueue = new SimpleQueue<>();
    }
}

免责声明:请不要以为我希望为我完成作业。我只是停留在这一点上,我认为这将是最好的提问地点。谢谢!

编辑:我采纳了您的一些建议,现在我的代码如下所示:

public class SimpleQueue<E> implements Queue<E>{

    private E[] myQueue;

    @SuppressWarnings("unchecked")
    //Constructor with no arguments.
    public SimpleQueue() {

        //This was changed. What does (E[]) do exactly?            
        this.myQueue = (E[]) new Object[5];
        System.out.println("A queue with length " + this.myQueue.length + " was created.");
    }
}

感谢您的建议!你们太棒了。

【问题讨论】:

  • 试试myQueue = (E[]) new Object[5];
  • 也许我还是一头雾水,但是在创建类的实例时不应该确定数组的类型(String[],Integer[],Object[])吗?例如,我的 SimpleQueue 类的目标是能够创建类的实例并确定数组的类型,因此需要泛型。有时我可能需要一个 String[] 数组,或者有时我可能需要一个 Integer[] 数组,但我不想编写两个不同的类。如果不总是使用 Object[] 数组,这是否可能?

标签: java arrays generics interface


【解决方案1】:

您可以创建一个对象数组Object[] myQueue;,并在需要获取值时将其内容转换为E

这是一个例子:

public class MyQueue<E> implements Queue<E> {
    private Object[] elements;
    private int startOfQueueIndex;
    private int numberOfElements;

    public MyQueue(int initialCapacity) {
        elements = new Object[initialCapacity);
        startOfQueueIndex = 0;
        numberOfElements = 0;
    }

    public boolean add(E e) {
        if (numberOfElements == elements.length)
            increaseElementArraySize();

        elements[(startOfQueueIndex + numberOfElements++) % elements.length] = e;
    }

    public E remove() {
        if (numberOfElements == 0)
            throw new NoSuchElementException();

        E element = (E)elements[startOfQueueIndex];

        startOfQueueIndex = (startOfQueueIndex + 1) % elements.length;

        return element;
    }

    // The rest of the methods go here ...
}

【讨论】:

  • 你能详细说明一下吗?
  • 我添加了一个示例(未经测试的代码!),我认为它应该可以解决问题。
  • 非常感谢,帮了大忙!我的代码现在运行顺利。
【解决方案2】:

对于学习参考,您可能需要查看 LinkedList 如何影响 Queue&lt;E&gt; 接口:这是 openjdk 实现的 grepcode link

LinkedList 没有底层数组,而是使用Node 对象。这样可以在您将新对象添加到列表时轻松分配它们。

有关如何处理底层数组的参考(确保足够的空间等),您可能希望看到ArrayList

代码注释很好,希望对你有帮助。

【讨论】:

  • 谢谢,我确实检查过了,但不幸的是我不允许使用 LinkedList。
【解决方案3】:

您不能创建新的 E 实例或 E 数组,因为 E 在编译时是未知类型。但你可以创建一个 E 列表。

private java.util.List<E> myQueue;

是正确的方式。

【讨论】:

  • 问题表明要求之一是不使用ArrayList。我感觉这适用于任何 List 实现。
猜你喜欢
  • 2011-02-25
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2013-08-03
相关资源
最近更新 更多