3

代码中有一个错误,说无法创建 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;
}

}
4

2 回答 2

2

错误在于,在 Java 中,创建不可具体化类型的新实例是非法的。不可具体化类型是在编译时存在但在运行时不存在的类型。

Java 中的泛型是通过擦除实现的,也就是说编译器在编译的时候会擦除所有泛型类型参数。因此,泛型类型信息在运行时不存在。因此,不允许创建泛型数组,因为编译器无法保证在运行时对数组的所有操作都是类型安全的。因此,编译器会引发错误。

Java 不能将以下不可具体化的类型创建为数组(E 是泛型类型参数):

  • E[]
  • List<E>[]
  • List<String>[]

您可以将数组转换为泛型类型并且程序将编译......但是代替错误您将收到有关未经检查的转换的警告。同样,类型信息在运行时不存在,因此警告会提醒您您的代码可能不是类型安全的。

您可以通过使用List<E>代替来规避您的问题E[N]。数组和泛型混合不好,因为在 Java 中数组是协变的(使数组能够在运行时知道它们的组件类型),而泛型集合是不变的(泛型类型信息在运行时不存在;编译器强制执行类型安全)。

于 2013-11-03T22:12:27.493 回答
0

Java 不允许创建泛型数组。你将不得不施放它

Q = new (E[]) Object[N];
于 2013-11-03T22:08:07.823 回答