2010-05-18 12 views
9

¿Es posible usar genéricos al pasar una clase a una función java?Pasar una clase genérica a una función java?

Tenía la esperanza de hacer algo como esto:

public static class DoStuff 
{ 
    public <T extends Class<List>> void doStuffToList(T className) 
    {  
     System.out.println(className); 
    } 

    public void test() 
    { 
     doStuffToList(List.class);  // compiles 
     doStuffToList(ArrayList.class); // compiler error (undesired behaviour) 
     doStuffToList(Integer.class); // compiler error (desired behaviour) 
    }  
} 

Lo ideal sería que las líneas List.class y ArrayList.class iba a funcionar bien, pero la línea Integer.class podría causar un error de compilación. Podría usar Class como mi tipo en lugar de T extends Class<List>, pero luego no captaré el caso Integer.class anterior.

Respuesta

14
public <T extends List> void doStuffToList(Class<T> clazz) 

Está pasando un Class después de todo - el parámetro debe ser de tipo Class y sus parámetros de tipo debe ser limitado

En realidad, <T extends Class<..> significa T == Class, porque Class es final. Y luego corrige el parámetro tipo de la clase a List - no List, solo List. Entonces, si quiere que su ejemplo funcione, necesitará:

public <T extends Class<? extends List>> void doStuffToList(T clazz) 

pero esto no es necesario en absoluto.

+0

Gracias, exactamente lo que estaba buscando. – rodo

+0

@Bozho http://stackoverflow.com/questions/27413818/cannot-access-class-methods-via-generics – Ava

5

ArrayList.class es del tipo Clase < ArrayList>, mientras que el parámetro debe ser una Clase < Lista>. Estos tipos no son compatibles, por el mismo motivo que la Lista < Entero> no es una Lista < Número>.

Se puede definir la función de la siguiente manera, y obtener el comportamiento esperado:

public void doStuffToList(Class<? extends List> className) 
Cuestiones relacionadas