Nie mogę dokładnie powiedzieć, co dostałeś, ale jedną różnicą jest to, że dla metody 2 możesz powiedzieć, że typ parametru to Class<String>
, podczas gdy dla metody 1 po prostu wiesz, że jest parametr o nazwie T
, ale ty nie nie zna dokładnego typu, z wyjątkiem klasy, dla której zadeklarowano T
, zostałby poddany podklasie z konkretną klasą dla T
.
Przykład:
class Foo<T> {
public void method1(T arg1) { ... }
}
class Bar extends Foo<Baz> { ... }
Foo<?> foo = new Foo<Baz>();
Bar bar = new Bar();
Dla foo
nie byłoby w stanie uzyskać typ T
przy starcie (nie, że wiem, że to Baz
) ani w czasie kompilacji. W przypadku bar
można uzyskać typ dla T
, ponieważ jest on już znany podczas kompilacji.
Kolejna różnica, gdy patrząc na kod:
Wywołanie getGenericParameterTypes()
na metody 1 powinien wrócić typ T
, nazywając ją do metody 2 należy powrócić Class<String>
. Jednakże, jeśli zadzwonisz getTypeParameters()
chcesz uzyskać T
typ dla metody 1, ale tablicę o zerowej długości w przypadku metody 2.
Edycja: od getParameterTypes()
miał zamiast getTypeParameters()
tutaj jest różnica widzę z kodem:
Dla metody 2 nie byłoby różnicy, ponieważ jeśli w podpisie nie są używane żadne generyczne, getGenericParameterTypes()
faktycznie wywołuje getParameterTypes()
. W przypadku metody 1 getGenericParameterTypes()
zwracana jest wartość ParameterizedType
, która określa, że parametr ma nazwę T
, podczas gdy getParameterTypes()
zwraca wymaganą klasę podstawową typu, np. Class<Object>
dla <T>
lub Class<Number>
dla <T extends Number>
.
przykro mi, ja popełniłem błąd. Miałem na myśli 'getParameterTypes', a nie' getTypeParameters'. Jest różnica. Ledwo zauważyłem. Czy możesz edytować swoją odpowiedź, aby odreagować tę zmianę? –
@ Santiago dodał informacje – Thomas
Dziękuję, bardzo docenione. –