Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.15.145] |
|
Сообщ.
#1
,
|
|
|
Добрый день! Есть класс DataTemplateJdbc<T>, нужно внутри него (например, в конструкторе) получить Class для типа <T>. Подскажите пожалуйста, как это сделать (и можно ли)?
|
Сообщ.
#2
,
|
|
|
Напрямую невозможно (значение T стирается после компиляции). Если есть параметр, имеющий тип T с ненулевым значением — можно вытащить из него через рефлексию (но это может быть тип-наследник).
К слову (извините, если не по теме), в Kotlin это сделать можно: https://stackoverflow.com/questions/4594958...-in-kotlin-work |
Сообщ.
#3
,
|
|
|
Спасибо!
|
Сообщ.
#4
,
|
|
|
Цитата Leklerk @ Добрый день! Есть класс DataTemplateJdbc<T>, нужно внутри него (например, в конструкторе) получить Class для типа <T>. Подскажите пожалуйста, как это сделать (и можно ли)? В Java возможно получить объект типа Class для параметра типа <T> внутри обобщенного класса DataTemplateJdbc<T>. Для этого можно использовать механизм рефлексии. Вот пример, как это можно сделать: public class DataTemplateJdbc<T> { private Class<T> clazz; public DataTemplateJdbc() { // Получаем объект типа Class для параметра типа <T> // С помощью getClass() на объекте типа T и получения его класса this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } // Другие методы и конструкторы класса DataTemplateJdbc<T>... public void printClassForT() { System.out.println("Class for T: " + clazz.getName()); } } В этом примере, в конструкторе класса DataTemplateJdbc<T>, мы используем метод getClass() для получения объекта Class текущего объекта типа T, а затем с помощью методов рефлексии getGenericSuperclass() и getActualTypeArguments() извлекаем фактический параметр типа <T> для класса DataTemplateJdbc<T>. Обратите внимание, что использование getGenericSuperclass() и getActualTypeArguments() предполагает, что класс DataTemplateJdbc<T> будет наследоваться от другого класса или расширять другой обобщенный класс, иначе, этот подход может не сработать. Примечание: Необходимо быть осторожным при использовании рефлексии, так как она может быть сложна в поддержке и потенциально опасна. Рассматривайте альтернативные подходы, если возможно, перед использованием рефлексии в своем коде. |
Сообщ.
#5
,
|
|
|
Здравствуйте! Спасибо за ответ. Но я протестировал - даже если для класса DataTemplateJdbc<T> сделать родителя (например, Parent<T>), в момент преобразования в Class<T> получается ошибка "class sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to class java.lang.Class". А если без родителя, то ошибка "class java.lang.Class cannot be cast to class java.lang.reflect.ParameterizedType".
|