Я чувствую себя совершенно глупо, когда мне нужно это задавать, но я не понимаю, почему не компилируется следующий код Java:
void <T> doSomething(List<T> items) {
Class<? extends T> clazz = items.get(0).getClass();
...
}
Из документа Java:
Фактическим типом результата является класс <? расширяет | X | > где | X | это стирание статического типа выражения, на котором getClass называется. Например, в этом фрагменте кода не требуется бросок:
Число n = 0; Класс <? extends Number > c = n.getClass();
EDIT:
-
Нашел это приятное объяснение о том, что означает стирание статического типа.
-
Есть способ сохранить информацию об общем типе с использованием подклассов, называемых маркером супер-типа. Теперь удаленный ответ полезным образом отметил, что в библиотеке Guava есть удобная утилита для использования этого.
-
Здесь отличная статья о том, чтобы извлечь обобщенные типы рефлексивно и красивую lib, называемую GenTyRef, упрощая его
-
Я разблокировал GenTyRef, чтобы добавить поддержку для работы с
AnnotatedType
(введено в Java 8). Он называется GenAnTyRef (и это в Maven Central)