Проблема обобщения и массивы

Извините, я не мог придумать более краткого заголовка.

У меня вопрос: почему работает следующий фрагмент кода:

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          
    }
}
}

Я знаю, как я могу обойти это сейчас, прочитав ваши ответы, но мне любопытно. Может ли кто-нибудь пролить свет на эту особенность?

Еще раз спасибо.

6
задан Steve 6 June 2011 в 20:14
поделиться