Извините, я не мог придумать более краткого заголовка.
У меня вопрос: почему работает следующий фрагмент кода:
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();
}
}
}
когда он не работает, делая массив Object таким универсальным:
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
}
}
}
Я знаю, как я могу обойти это сейчас, прочитав ваши ответы, но мне любопытно. Может ли кто-нибудь пролить свет на эту особенность?
Еще раз спасибо.