Lo siento, no pude pensar en un título más conciso.Problema con los generadores y arreglos
Mi pregunta es ¿por qué el siguiente fragmento de código de trabajo:
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();
}
}
}
cuando no va a funcionar haciendo que la matriz de objeto genérico como tan:
public abstract class TObjectPool<T> {
protected T[] availableObjects;
TObjectPool(int size){
availableObjects = (T[]) new Object[size];
}
Cuando los availableObjects [i] = nuevo RenderElement(); línea se ejecuta en este último ejemplo, obtengo una ClassCastException. Entiendo por qué funciona en el primer ejemplo, pero no por qué no funciona en el segundo. availableObjects debe ser una matriz de RenderElement y estoy tratando de darle un RenderElement. ¿Qué parte crucial de la información me falta?
Gracias por la ayuda.
actualización ...
Muchas gracias por las respuestas. Yo pensaba que entendía pero he logrado confundir a mí mismo de nuevo:
Si añado la función:
public void add(int index, T object){
availableObjects[index] = object;
}
a la clase TObjectPool. Funcionará felizmente con la matriz T [].
Así que el nuevo TObjectPool y piscina con subclases son las siguientes:
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
}
}
}
sé cómo puedo conseguir alrededor de esto ahora después de leer sus respuestas pero tengo curiosidad. ¿Alguien puede arrojar algo de luz sobre esta peculiaridad?
Gracias de nuevo.
es una buena pregunta. ¡Lo estoy pensando durante los últimos 5 minutos y no sé la respuesta! – AlexR
por favor! Danos [SSCCE] (http://sscce.org) fragmento de código de estilo. – MockerTim