java class<t> - ¿Cuál es la razón por la que no puedo crear tipos de arreglos genéricos en Java?




7 Answers

Es porque los arreglos de Java (a diferencia de los genéricos) contienen, en tiempo de ejecución, información sobre su tipo de componente. Por lo tanto, debe conocer el tipo de componente cuando cree la matriz. Como no sabe qué es T en tiempo de ejecución, no puede crear la matriz.

generico genericas

¿Cuál es la razón por la que Java no nos permite hacer?

private T[] elements = new T[initialCapacity];

Pude entender que .NET no nos permitió hacerlo, ya que en .NET tiene tipos de valor que en tiempo de ejecución pueden tener diferentes tamaños, pero en Java todos los tipos de T serán referencias de objetos, por lo tanto, tendrán el mismo tamaño ( corrígeme si me equivoco).

¿Cual es la razon?




Al no proporcionar una solución decente, simplemente terminas con algo peor IMHO.

El trabajo común es como sigue.

T[] ts = new T[n];

se reemplaza por (asumiendo que T extiende el objeto y no otra clase)

T[] ts = (T[]) new Object[n];

Prefiero el primer ejemplo, sin embargo, los tipos más acedémicos parecen preferir el segundo, o simplemente prefieren no pensar en ello.

La mayoría de los ejemplos de por qué no puede usar un Objeto [] se aplica igualmente a la Lista o Colección (que son compatibles), por lo que los veo como argumentos muy pobres.

Nota: esta es una de las razones por las que la biblioteca de Colecciones no se compila sin advertencias. Si no se puede admitir este caso de uso sin advertencias, algo se rompe con el modelo genérico IMHO.




La respuesta ya se dio, pero si ya tiene una instancia de T, puede hacer esto:

T t; //Assuming you already have this object instantiated or given by parameter.
int length;
T[] ts = (T[]) Array.newInstance(t.getClass(), length);

Espero, podría ayudar, Ferdi265




La razón principal se debe al hecho de que los arreglos en Java son covariantes.

Hay una buena visión general here .




En mi caso, simplemente quería una serie de pilas, algo como esto:

Stack<SomeType>[] stacks = new Stack<SomeType>[2];

Como esto no era posible, utilicé lo siguiente como solución alternativa:

  1. Creó una clase de envoltorio no genérico alrededor de Stack (por ejemplo, MyStack)
  2. MyStack [] apila = el nuevo MyStack [2] funcionó perfectamente bien

Feo, pero Java es feliz.

Nota: como lo mencionó BrainSlugs83 en el comentario a la pregunta, es totalmente posible tener matrices de genéricos en .NET




Sé que llego un poco tarde a la fiesta aquí, pero me di cuenta de que podría ayudar a cualquier futuro de Google, ya que ninguna de estas respuestas solucionó mi problema. Sin embargo, la respuesta de Ferdi265 ayudó enormemente.

Estoy tratando de crear mi propia lista vinculada, por lo que el siguiente código es lo que funcionó para mí:

package myList;
import java.lang.reflect.Array;

public class MyList<TYPE>  {

    private Node<TYPE> header = null;

    public void clear() {   header = null;  }

    public void add(TYPE t) {   header = new Node<TYPE>(t,header);    }

    public TYPE get(int position) {  return getNode(position).getObject();  }

    @SuppressWarnings("unchecked")
    public TYPE[] toArray() {       
        TYPE[] result = (TYPE[])Array.newInstance(header.getObject().getClass(),size());        
        for(int i=0 ; i<size() ; i++)   result[i] = get(i); 
        return result;
    }


    public int size(){
         int i = 0;   
         Node<TYPE> current = header;
         while(current != null) {   
           current = current.getNext();
           i++;
        }
        return i;
    }  

En el método toArray () se encuentra la manera de crear una matriz de un tipo genérico para mí:

TYPE[] result = (TYPE[])Array.newInstance(header.getObject().getClass(),size());    



Se debe a que los genéricos se agregaron a Java después de que lo crearon, por lo que es un poco torpe porque los creadores originales de Java pensaron que al hacer una matriz, el tipo se especificaría en su fabricación. Así que eso no funciona con genéricos, así que tienes que hacer E [] array = (E []) nuevo Objeto [15]; Esto compila pero da una advertencia.




Related

java generics type-erasure