所以我正在尝试在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,但我不想使用它,因为它比我需要的更多,我关心的是包大小。
答案 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
来构造结果数组。