Создание Текстового объекта, соответствующего универсальному типу

В Java, как я могу создать a Type объект для Map<String, String>?

System.out.println(Map<String, String>.class);

не компилирует. Одно обходное решение, о котором я могу думать,

Map<String, String> dummy() { throw new Error(); }
Type mapStringString = Class.forName("ThisClass").getMethod("dummy", null).getGenericReturnType();

Действительно ли это - корректный путь?

5
задан Alexey Romanov 7 June 2010 в 11:53
поделиться

3 ответа

public class Test {
    public Map<String, String> dummy;
    public static void main(String... args) throws SecurityException, 
                                                   NoSuchFieldException {
        Type mapStringString = Test.class.getField("dummy").getGenericType();
        // ...

Это чуть менее уродливый хак...


Как предлагает Том Хотин, вы можете реализовать методы самостоятельно:

Type mapStrStr2 = new ParameterizedType() {
    public Type getRawType() {
        return Map.class;
    }
    public Type getOwnerType() {
        return null;
    }
    public Type[] getActualTypeArguments() {
        return new Type[] { String.class, String.class };
    }
};

возвращает те же значения, что и другой подход для методов, объявленных в ParameterizedType. Результат первого подхода даже .equals этого типа. (Однако этот подход не переопределяет toString, equals и так далее, поэтому в зависимости от ваших потребностей первый подход может оказаться лучше)

.
5
ответ дан 14 December 2019 в 08:43
поделиться

Все это делается с помощью интерфейсов, поэтому вы можете создать свою собственную реализацию.

Однако самый простой способ - использовать отражение в фиктивном классе, созданном для этой цели.

2
ответ дан 14 December 2019 в 08:43
поделиться

Да, это правильный и единственный способ получить дженерики во время выполнения.Тип стирается («стирание типа»), Карта байт-кода на самом деле является картой объект-объект, определение обобщений в исходном коде используется компилятором только для обеспечения безопасности типов.

0
ответ дан 14 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: