Pojawiło się jako pytanie, które zadałem niedawno w wywiadzie, jako coś, co kandydat chciał, aby zostało dodane do języka Java. Powszechnie uważa się, że problem z tym, że Java nie ma zreifikowanych typów generycznych, ale gdy został popchnięty, kandydat nie mógł mi powiedzieć, jakie rzeczy mógłby osiągnąć, gdyby tam byli.
Oczywiście, ponieważ surowe typy są dozwolone w Javie (i niebezpieczne testy), możliwe jest obalenie typów generycznych i otrzymanie List<Integer>
tego (na przykład) faktycznie zawiera String
s. Oczywiście mogłoby to być niemożliwe, gdyby informacje o typie zostały zreifikowane; ale musi być coś więcej !
Czy ludzie mogliby publikować przykłady rzeczy, które naprawdę chcieliby zrobić , gdyby dostępne były reifikowane leki generyczne? To znaczy, oczywiście możesz uzyskać typ a List
w czasie wykonywania - ale co byś z tym zrobił?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDYCJA : Szybka aktualizacja, ponieważ odpowiedzi wydają się być głównie zaniepokojone potrzebą przekazania a Class
jako parametru (na przykład EnumSet.noneOf(TimeUnit.class)
). Szukałem czegoś podobnego do tego, gdzie to po prostu nie jest możliwe . Na przykład:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?