2012-10-07 15 views
5

Si tengo algo como:Tipo de captura genérica en Java

class Test<T extends X> { 
    public T test() { 
     T t = /* ... */; 
     return t; 
    } 
} 

Cómo puede capturar I T 's de clase para que pueda crear instancias de ella? ¿Hay soluciones para evitar el borrado de tipos? Ni siquiera necesito tener acceso a los métodos de T, X me irá bien, pero necesito devolver un T.

Respuesta

4

Lo único que puede hacer es pasar la clase de T como argumento adicional, ya sea a test() o establecer un campo de miembro en la clase Test. No puede evitar el borrado de tipo.

class Test<T extends X> { 
    private Class<T> mClass; 
    public Test(Class<T> c) { 
     mClass = c; 
    } 
    public T test() { 
     T t = mClass.newInstance(); 
     return t; 
    } 
} 

O puede pasar un objeto de fábrica con el mismo efecto. Esto funciona bien cuando necesita usar algo que no sea un constructor predeterminado.

+0

mClass.getConstructor(). NewInstance() es mejor, ya que no oculta las excepciones comprobadas, pero las ajusta correctamente en InvocationTargetException. –

3

lo definen como:

class Test<T extends X> 
{ 
    public T test(Class<T> c) 
    { 
     T t = c.newInstance(); 
     return t; 
    } 
} 

y usarlo como:

Test<Foo> t = new Test<Foo>(); 
t.test(Foo.class); 
0

No puede hacerlo directamente, pero puede agregar una interfaz que implementa T para crear una instancia, o una matriz de T.

Cuestiones relacionadas