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>
.
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? –
@Tiago agregó la información – Thomas
Gracias, muy apreciado. –