2011-07-19 13 views
7

Estoy tratando de aprender la diferencia entre los métodos getGenericParameterTypes y getParameterTypes. Sé que uno devuelve Class[] y el otro Type[]. Pero, ¿cuál es la diferencia real?Diferencia entre getGenericParameterTypes y getParameterTypes

métodos Considerando:

public void method1(T arg1) 
public void method2(String arg2) 

¿Qué iba a conseguir cuando se invoca cada uno de los métodos get sobre cada uno de los métodos de ejemplo?

Respuesta

6

No puedo decirle exactamente lo que obtendría, pero una diferencia es que para el método 2 puede decir que el tipo de parámetro es Class<String> mientras que para el método 1 sabrá que hay un parámetro llamado T, pero no lo usa 't saber el tipo exacto, excepto la clase donde se declara T que se habría subclasificado con una clase concreta para T.

Ejemplo:

class Foo<T> { 
    public void method1(T arg1) { ... } 
} 

class Bar extends Foo<Baz> { ... } 

Foo<?> foo = new Foo<Baz>(); 
Bar bar = new Bar(); 

Para foo que no sería capaz de obtener el tipo de T en tiempo de ejecución (no sabría que es Baz), ni en tiempo de compilación. Para bar, puede obtener el tipo de T, ya que es conocido en tiempo de compilación.

Otra diferencia cuando se mira en el código:

Calling getGenericParameterTypes() en el método 1 debe devolver el tipo T, llamándolo por el método 2 debe devolver Class<String>. Sin embargo, si se llama a getTypeParameters() se obtendría el tipo T para el método 1, pero una matriz de longitud cero para el método 2.

Editar: desde getParameterTypes() estaba destinado en lugar de getTypeParameters() aquí está la diferencia que puedo ver desde el código:

Para el método 2 no habría diferencia, ya que si no se utilizan genéricos en la firma, getGenericParameterTypes() realmente llama a getParameterTypes(). Para el método 1 getGenericParameterTypes() se devolverá un ParameterizedType que indica que el parámetro tiene el nombre T, mientras que getParameterTypes() devolverá la clase base requerida del tipo, p. Ej. Class<Object> para <T> o Class<Number> para <T extends Number>.

+0

Lo siento, me he equivocado. Quise decir 'getParameterTypes' y no' getTypeParameters'. Hay una diferencia. Apenas me di cuenta. ¿Podrías editar tu respuesta para reflejar este cambio? –

+0

@Tiago agregó la información – Thomas

+0

Gracias, muy apreciado. –

5

getGenericParameterTypes puede devolver otro tipo de Type s. getParameterType es la reflexión "pre-genéricos". Esto significa que T se considerará como java.lang.Object. Compruebe este ejemplo:

public class Generics<T> { 

    public void method1(T t) { 
    } 

    public static void main(String[] args) throws Exception { 
     Method m = Generics.class.getMethod("method1", Object.class); 
     for (Type t : m.getGenericParameterTypes()) { 
      System.out.println("with GPT: " + t); 
     } 
     for (Type t : m.getParameterTypes()) { 
      System.out.println("with PT: " + t); 
     } 
    } 

} 

La salida es:

with GPT: T 
with PT: class java.lang.Object