作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我尝试在 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
)一起使用,但是我调用的所有内容 myEnum[] = myCircularBuffer.getArray()
,我得到一个:
java.lang.ClassCastException: java.lang.Object[] cannot be cast to com.package.myEnum[]
关于制作这样的东西有什么技巧吗?
编辑:我知道 Apache CircularFifoQueue,但我不想使用它,因为它超出了我的需要,而且我担心包的大小。
最佳答案
您必须使内部 mArray
成为通用类型 E
的数组,而不是 Object
的数组。为此,您必须更改构造函数以同时获取通用 E
类型的 Class
。并且还声明您的 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();
关于java - 从对象转换为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25112495/
我是一名优秀的程序员,十分优秀!