Creación de instancias de tipos genéricos en Java

Resuelto Mohd Farid asked hace 14 años • 12 respuestas

Me gustaría crear un objeto de tipo genérico en java. Sugiera cómo puedo lograr lo mismo.

Nota: Esto puede parecer un problema de genéricos trivial. Pero apuesto... que no lo es. :)

supongamos que tengo la declaración de clase como:

public class Abc<T> {
    public T getInstanceOfT() {
       // I want to create an instance of T and return the same.
    }
}
Mohd Farid avatar Mar 12 '10 23:03 Mohd Farid
Aceptado
public class Abc<T> {
    public T getInstanceOfT(Class<T> aClass) {
       return aClass.newInstance();
    }
}

Tendrás que agregar manejo de excepciones.

Debe pasar el tipo real en tiempo de ejecución, ya que no forma parte del código de bytes después de la compilación, por lo que no hay forma de saberlo sin proporcionarlo explícitamente.

Jens Schauder avatar Mar 12 '2010 16:03 Jens Schauder

En el código que publicaste, es imposible crear una instancia Tya que no sabes de qué tipo es:

public class Abc<T>
{
       public T getInstanceOfT()
       {
           // There is no way to create an instance of T here
           // since we don't know its type
       }
} 

Por supuesto, es posible si tiene una referencia Class<T>y Tun constructor predeterminado, simplemente llame newInstance()al Classobjeto.

Si crea una subclase, Abc<T>incluso puede solucionar el problema de borrado de tipos y no tendrá que pasar ninguna Class<T>referencia:

import java.lang.reflect.ParameterizedType;

public class Abc<T>
{
    T getInstanceOfT()
    {
        ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();
        Class<T> type = (Class<T>) superClass.getActualTypeArguments()[0];
        try
        {
            return type.newInstance();
        }
        catch (Exception e)
        {
            // Oops, no default constructor
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args)
    {
        String instance = new SubClass().getInstanceOfT();
        System.out.println(instance.getClass());
    }
}

class SubClass
    extends Abc<String>
{
}
Martin avatar Mar 12 '2010 16:03 Martin