对不起,我想不出一个更简洁的标题。仿制药问题和阵列
我的问题是,为什么下面这段代码的工作:
public abstract class TObjectPool<T> {
protected Object[] availableObjects;
TObjectPool(int size){
availableObjects = new Object[size];
}
protected class RenderElementPool extends TObjectPool<RenderElement>{
@Override
public void fill() {
for (int i = 0; i < capacity; i++) {
availableObjects[i] = new RenderElement();
}
}
}
时,它不会工作使对象数组的通用像这样:
public abstract class TObjectPool<T> {
protected T[] availableObjects;
TObjectPool(int size){
availableObjects = (T[]) new Object[size];
}
当availableObjects [I] = new RenderElement();行在后面的例子中执行我得到一个ClassCastException。我明白为什么它在第一个例子中有效,但不是为什么它不在第二个例子中。 availableObjects应该是一个RenderElement数组,我试图给它一个RenderElement。我错过了哪些关键信息?
感谢您的帮助。
更新...
非常感谢您的答复。我想我理解,但我已成功地再次混淆自己:
如果我的函数添加:
public void add(int index, T object){
availableObjects[index] = object;
}
到TObjectPool类。它会很高兴地使用T []数组。
所以新TObjectPool和子类池如下:
public abstract class TObjectPool<T> {
T[] availableObjects;
TObjectPool(int size){
availableObjects = (T[])new Object[size];
capacity = size;
count = capacity;
fill();
}
public void add(int index, T object){
availableObjects[index] = object;
}
protected class RenderElementPool extends TObjectPool<RenderElement>{
@Override
public void fill() {
for (int i = 0; i < capacity; i++) {
add(i, new RenderElement()); //this works
//availableObjects[i] = new RenderElement(); //this gives an exception
}
}
}
我知道我能避开这个问题,现在读您的答复后,但我很好奇。任何人都可以从这个特点中了解一些情况吗?
再次感谢。
这是如此好的问题。我在最后5分钟考虑它,不知道答案! – AlexR 2011-06-06 18:35:59
请!给我们[SSCCE](http://sscce.org)样式的代码片段。 – MockerTim 2011-06-06 18:43:38