2012-05-31 19 views
8

Estoy atascado. Viniendo de C++, pensé que esto simplemente funcionaría, pero no es así. ¿Puedes darme un consejo? Voy a tratar de no terminar con tipo de método de creación en cada clase se utiliza para T.Crear una instancia del tipo genérico en java

public class A<T>{ 

    private T t_; 

    public A(){ 
     t_ = new T(); //error 
    } 

} 

Además no quieren tener el aspecto constructor: A (Clase classT) {... Idealmente i me gustaría tener algo así como este código de C++.

template<class T> 
class A{ 
private: 
    T t_; 

public: 
    A(){} 

}; 

Gracias por su ayuda.

+0

posible duplicado de [Crear instancia de tipo genérico en Java?] (http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java) – pingw33n

+0

tiene razón. completamente pasado por alto que – nux

Respuesta

5

Lamento desilusionarlo, pero esto es simplemente imposible en Java sin constructores.

Java tira a la basura la información genérica en tiempo de ejecución (véase el tipo de borrado)

11

Además de la cuestión del tipo de borrado - lo que hace que esto sea imposible, en todo caso - que simplemente no puede garantizar que un T ha expuesto, constructor sin argumentos!

La solución tradicional es pasar alrededor de objetos de fábrica que proporcionan métodos que se pueden utilizar para obtener objetos T. Un ejemplo simple sería

interface Factory<T> { 
    T create(); 
} 

y luego su clase puede conseguir un Factory<T> y llame create() en él para obtener más T s. Los ejemplos más sofisticados pueden requerir argumentos adicionales para un método create, por ejemplo, o sobrecargas.

Las soluciones menos atractivas incluyen la reflexión explícita, que pasa alrededor de los objetos Class<T>. Por ejemplo, ArrayList.class.newInstance() devuelve un ArrayList bruto recientemente construido. Tiene que pasar explícitamente alrededor del objeto Class, y el enfoque basado en la reflexión es más lento que un constructor normal o un objeto de fábrica (aunque la velocidad de reflexión ha mejorado últimamente). También dependes de la clase que expone un constructor no-arg, que no siempre es el caso. Se puede hacer que funcione, pero nunca es lo que yo llamaría "agradable".

(Dicho esto, como referencia, hay indicios de que la situación puede cambiar algo en Java 8 con el Proyecto Lambda y amigos.)

+0

Gracias por la pista. Parece que tengo que hacerlo de esa manera: / – nux

0

probar esto:

private <E extends ISomething> E createInstance(Class<E> clazz) { 
     E ret; 
     try { 
      ret = clazz.newInstance(); 
      ret.setSomething(something); 

     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return ret; 
    } 
Cuestiones relacionadas