我无法理解泛型,接口和数组的细微差别以及如何将它们结合使用。我有一个中级Java类的作业。作业如下:
我遇到的问题是数组的初始化。这是我的代码:
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.");
}
}
谢谢你的建议!你们真棒。
答案 0 :(得分:2)
您可以创建一个Object数组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 ...
}
答案 1 :(得分:1)
要获得学习参考,您可能需要查看LinkedList
界面Queue<E>
的影响方式:这里是grepcode link的openjdk实现。
LinkedList
没有底层数组,而是使用Node
个对象。这样可以在将新对象添加到列表时轻松分配新对象。
有关如何处理基础数组(确保足够的空间等)的参考,您可能希望看到ArrayList。
代码评论很好,我希望它可以帮到你。
答案 2 :(得分:0)
您无法创建新的E实例或E数组,因为E在编译时是未知类型。但你可以创建一个E列表。
private java.util.List<E> myQueue;
是正确的方法。