Как получить ссылку на объект `Class <T>` для универсального класса с определенными параметрами типа? - PullRequest
0 голосов
/ 18 мая 2018

Например, у меня может быть

Class c = Map.class;

Но что, если мне нужно c для ссылки на класс Map<String, ValueClass>?

Я хочу сделать что-то, что выражает

Class c = (Map<String, ValueClass>).class;

Мой пример использования заключается в том, что мне нужно сделать это, чтобы я мог передать c в getConstructor

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Если вы действительно хотите получить статический тип так, как вам нужно, вы можете пробиться к нему, используя приведение (хотя и через необработанные типы):

Class<Map<String, Object>> cl = (Class) Map.class;

Однако, как указано в других комментариях и другихответ, это не поможет вам, так как во время выполнения ваш class.getConstructor() вызов все равно будет видеть только Map.class.Просто рассмотрите подпись getConstructor:

getConstructor(Class<?>... parameterTypes)

Реализация извлекает конструктор путем сравнения параметров (проверьте источник java.lang.Class.arrayContentsEq(Object[], Object[])).Подводя итог, можно сказать, что сравнение сводится к (Class) cl == Map.class, а во время выполнения возвращается true, что объясняет, почему бесполезно искать экземпляр общего класса.


Значение Class<Map<String, Object>> cl будетэффективны только в том случае, если они использовались для статической проверки типов, но в этом случае это не помогает.

0 голосов
/ 18 мая 2018

Специальный тип Map<String, ValueClass> совместно использует тот же объект класса с Map, поэтому вы не можете получить объект пользовательского класса.

Во время выполнения (Map<String, ValueClass>).class равно Map.class из-за Тип стирания :

public static void main(String[] args) {
    Map map = new HashMap();
    Map<String, Integer> anotherMap = new HashMap<>();
    System.out.println(map.getClass().equals(anotherMap.getClass())); // true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...