代码中有一个错误,指出无法创建E的通用数组。 任何人都可以帮助我谢谢
**Q = new E[N];**
这是完整的代码;
package org.circular;
public class CircularArrayQueue<E> implements QueueADT<E> {
private static final int capacity = 5;
private E[] Q;
private final int N; // capacity
private int f = 0;
private int r = 0;
public CircularArrayQueue() {
this(capacity);
}
public CircularArrayQueue(int capacity) {
N = capacity;
Q = new E[N];
}
public int size() {
if (r > f)
return r - f;
return N - f + r;
}
public boolean isEmpty() {
return (r == f) ? true : false;
}
public boolean isFull() {
int diff = r - f;
if (diff == -1 || diff == (N - 1))
return true;
return false;
}
public void enqueue(E element) throws FullQueueException {
if (isFull()) {
throw new FullQueueException("Full");
} else {
Q[r] = element;
r = (r + 1) % N;
}
}
public E dequeue() throws EmptyQueueException {
E item;
if (isEmpty()) {
throw new EmptyQueueException("Empty");
} else {
item = Q[f];
Q[f] = null;
f = (f + 1) % N;
}
return item;
}
@Override
public E front() throws EmptyQueueException {
if (isEmpty()) {
throw new EmptyQueueException("Empty");
}
return null;
}
}
答案 0 :(得分:2)
错误在于,在Java中,创建不可重新类型的新实例是非法的。不可重新生成的类型是在编译时存在但在运行时不存在的类型。
Java中的泛型由擦除实现,也就是说编译期间编译器会擦除所有泛型类型参数。因此,通用类型信息在运行时不存在。因此,不允许创建通用数组,因为编译器无法保证在运行时对阵列上的所有操作都是类型安全的。因此,编译器会引发错误。
以下不可再生类型不能通过Java创建为数组(E是泛型类型参数):
E[]
List<E>[]
List<String>[]
您可以将数组转换为泛型类型,程序将编译...但是,如果代替错误,您将收到有关未经检查的强制转换的警告。同样,类型信息在运行时不存在,因此警告提示您代码可能不是类型安全的。
您可以使用List<E>
代替E[N]
来规避您的问题。数组和泛型混合不佳,因为Java数组是协变的(使数组在运行时能够知道它们的组件类型)而泛型集合是不变的(通用类型信息在运行时不存在;编译器强制执行类型安全)。 p>
答案 1 :(得分:0)
Java不允许创建通用数组。你将不得不施展它
Q = new (E[]) Object[N];