从Object转换为Enum

时间:2014-08-04 05:54:05

标签: java arrays generics

所以我正在尝试在Java中实现一个CircularBuffer,我可以访问底层的array

/* package protected */ class CircularBuffer<E> {
private final Object[] mArray;
private int mSize;
private int headPointer = 0;

private CircularBuffer(int size) {
  mSize = size;
  mArray = new Object[mSize];
}

private void add(E elem) {
  mArray[headPointer] = elem;
  headPointer = (headPointer + 1) % mSize;
}

public E[] getArray() {
  return (E[]) this.mArray;
}

}

我想将此与Enums和各种原语(特别是boolean s)一起使用,但我称之为myEnum[] = myCircularBuffer.getArray()的所有内容,我得到了:

java.lang.ClassCastException: java.lang.Object[] cannot be cast to com.package.myEnum[]

有关制作此类作品的任何提示吗?

编辑:我确实知道Apache CircularFifoQueue,但我不想使用它,因为它比我需要的更多,我关心的是包大小。

2 个答案:

答案 0 :(得分:3)

您必须使内部mArray成为通用类型E的数组,而不是Object的数组。为此,您必须更改构造函数以获取通用Class类型的E。并且还声明您的mArray属于E[]类型,这将帮助您避免进一步的不必要的强制转换(例如,您的getArray()方法只需返回mArray而无需强制转换。)

你可以这样做:

private final E[] mArray;

private CircularBuffer(int size, Class<E> type) {
    mSize = size;
    mArray = (E[]) Array.newInstance(type, size);
}

你可以像这样使用它:

CircularBuffer<String> buff = new CircularBuffer<>(10, String.class);
String[] arr = buff.getArray();

答案 1 :(得分:0)

您有一个运行时类型为Object[]的数组。它不可能是E[],因为数组在运行时知道它们的组件类型,并且您的类可能不知道E是什么,因为它在运行时不知道它。

想象一下,如果你能做到,那么new CircularBuffer<E>(size).getArray()将成为做new E[size]的后门方式,这在Java中是不可能的。

您可以查看Java标准库中List接口的作用。它也不知道运行时的泛型参数。它有两个toArray方法:1)一个没有返回类型Object[]的参数,以及一个采用T[]参数并返回T[]的方法。第二个需要传入一个数组来获取类型T来构造结果数组。