Creación de instancias de tipos genéricos en Java
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.
}
}
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.
En el código que publicaste, es imposible crear una instancia T
ya 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 T
un constructor predeterminado, simplemente llame newInstance()
al Class
objeto.
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>
{
}