Могу ли я вызвать .class для универсального типа в Java?

Мне было интересно, есть ли способ в Java сделать что-то вроде

<code>Class c = List<String>.class;
Class c2 = List<Date>.class;
</code>

Мне нужно что-то вроде этого, чтобы создать карту, которая хранит имя класса (с универсальным типом) и соответствующий объект, который я могу позже посмотреть. Например,

<code>Map<Class, Object> dataMap = new HashMap<Class, Object>();
dataMap.put(c, listOfStrings);
dataMap.put(c2, listOfDates);
</code>

Это невозможно из-за стирания типа во время выполнения?

Ответы на вопрос(3)

can достичь общей цели, используя тот же подход, что и GuiceTypeLiteral, Если вы уже используете Guice, я предлагаю вам использовать это напрямую - в противном случае вы можете создать свой собственный подобный класс.

По сути, идея заключается в том, что подклассы универсального типа, которые указывают аргументы типа, напрямую сохраняют эту информацию. Итак, вы пишете что-то вроде:

TypeLiteral literal = new TypeLiteral<List<String>>() {};

Тогда вы можете использоватьliteral.getClass().getGenericSuperclass() и получить аргументы типа из этого.TypeLiteral сам по себе не должен иметь какой-либо интересный код (я не знаю, является ли онdoes есть что-нибудь в Guice, по другим причинам).

 21 апр. 2012 г., 10:41
@ user384706: Нет, я не предлагал использовать зависимость от Guice только для этого. Я прямо сказалif вы уже используете Guice, вы можете использовать его, в противном случае создайте свой собственный тип. Если бы был какой-либо значимый код вTypeLiteral тогда получение зависимости может быть более полезным, но в этом случае этоidea это более интересно, чем реализация.
 21 апр. 2012 г., 19:12
Гуава 12 (через неделю или две) придетсяTypeToken, которая играет ту же роль, хотя и с еще несколькими наворотами.
 21 апр. 2012 г., 11:24
+1 за упоминание Guice, я этого не знал ... Спасибо.
 21 апр. 2012 г., 10:37
@John: один маленький вопрос в мою пользу: это вообще хороший вариант для введения зависимости от сторонней библиотеки для решения одной проблемы? Я имею в виду, если бы это была, например, криптография, я бы это понял. Но есть ли предел? когда нужно сказать, может быть, мне следует «заново изобрести» это вместо того, чтобы добавить дополнительные 4 МБ в след, например?

Это невозможно, как вы пытаетесь.
Но ты могдекорироватьэти списки и создатьMyListDates а такжеMyListString вместо этого и сохраните их в hashmap

List<String>.class в вашем коде - это приводит к ошибке компиляции. Существует только один единственный объект класса дляListи это называетсяList.class.

Is this not possible because of type erasure during runtime ?

Правильный.

Кстати, этоgeneric тип, а не аннотированный тип.

Update

Подумав еще, вы можете получить что-то довольно близкое к вашей карте, настроив Джоша Блоха.typesafe heterogenous container (опубликовано вEffective Java 2-е изд., Ст. 29) немного:

public class Lists {
    private Map<Class<?>, List<?>> lists =
            new HashMap<Class<?>, List<?>>();

    public <T> void putList(Class<T> type, List<T> list) {
        if (type == null)
            throw new NullPointerException("Type is null");
        lists.put(type, list);
    }

    public <T> List<T> getList(Class<T> type) {
        return (List<T>)lists.get(type);
    }
}

Актерский состав вgetList не проверяется, выдает предупреждение, но, боюсь, мы не сможем этого избежать. Тем не менее, мы знаем, что значение хранится для классаX должен бытьList<X>, так как это гарантировано компилятором. Поэтому я думаю, что актерский состав безопасен (если вы играете по правилам, то есть - никогда не звонитеputList с простым неуниверсальнымClass параметр), таким образом, это может быть подавлено с помощью@SuppressWarnings("unchecked").

И вы можете использовать это так:

Lists lists = new Lists();
List<Integer> integerList = new ArrayList<Integer>();
List<String> stringList = new ArrayList<String>();
...

lists.putList(Integer.class, integerList);
lists.putList(String.class, stringList);
List<Integer> storedList = lists.getList(Integer.class);

assertTrue(storedList == integerList);
 Rahul21 апр. 2012 г., 10:53
Благодарю. Я не знаю, почему я сказал аннотированный :-) Исправили.
 21 апр. 2012 г., 11:23
@Rahul, пожалуйста, смотрите мое обновление для потенциального решения вашей проблемы.

Ваш ответ на вопрос