Это возникло как вопрос, который я задал в интервью в последнее время как то, что кандидат хотел увидеть, добавив на язык Java. Это обычно называется болью, когда у Java нет reified generics, но, когда он был нажат, кандидат не мог сказать мне своего рода вещи, которые он мог бы достичь, были там.
Очевидно, что поскольку типы типов допустимы в Java (и небезопасные проверки), можно подорвать генерические файлы и заканчивать с помощью List<Integer>
, который (например) фактически содержит String
s. Это явно можно было бы сделать невозможным, поскольку информация о типе была подтверждена; но должно быть больше этого!
Могут ли люди публиковать примеры того, что они действительно хотели бы сделать, были ли доступны генерируемые генерики? Я имею в виду, очевидно, что вы можете получить тип List
во время выполнения, но что бы вы сделали с ним?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
РЕДАКТИРОВАТЬ. Быстрое обновление этого вопроса, поскольку ответы, по-видимому, в основном касаются необходимости передавать в Class
в качестве параметра (например, EnumSet.noneOf(TimeUnit.class)
). Я больше искал что-то вроде того, где это просто невозможно. Например:
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?