Как вы получаете доступ к объекту класса для генериков? - PullRequest
3 голосов
/ 19 января 2009

Как я могу получить доступ к объекту Class для Generics?

В настоящее время я делаю это так:

List<String> list= new ArrayList<String>();
list.getClass();

Это нормально? Или какой должен быть путь?

Ответы [ 2 ]

7 голосов
/ 19 января 2009

Будет возвращено так же, как ArrayList.class. Обобщения Java стирают универсальный тип во время выполнения; другими словами, из списка вы никогда не узнаете, что тип элемента - String. На

есть отличный ответ на этот вопрос.

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

3 голосов
/ 19 января 2009

Это правда, что стирание делает невозможным получение информации об общем типе данного объекта, поскольку обобщения хранятся только в структуре исходного кода. Однако это не означает, что невозможно получить параметры общего типа, и во многих важных случаях (например, создание интерфейсов для данного класса / метода) вы можете это сделать. Если вы овладеете элементами класса посредством отражения, вы можете получить общую информацию об объявленных используемых типах.

Например, возьмите java.lang.reflect.Method с помощью отражения и позвоните, например, getGenericReturnType () на нем. Это вернет экземпляр java.lang.reflect.Type, который может быть просто Class, но также может быть экземпляром ParameterizedType или даже WildcardType, где это необходимо. Оба этих последних случая позволяют вам видеть объявленные универсальные типы. Я не знаю ни одного особенно элегантного способа справиться с этим, кроме instanceof проверок, но информация есть, если вам это нужно.

Это может дать информацию о универсальных типах полей, параметрах методов и возвращаемых типах, а также о самом классе (как его собственных универсальных параметрах, так и его суперклассе и реализованных интерфейсах). Это может быть очень полезно, если вам нужно выполнить типобезопасную проверку аргументов для универсальных методов в отражающем контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...