На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Как из дженерика получить Class?
    Добрый день! Есть класс DataTemplateJdbc<T>, нужно внутри него (например, в конструкторе) получить Class для типа <T>. Подскажите пожалуйста, как это сделать (и можно ли)?
      Напрямую невозможно (значение T стирается после компиляции). Если есть параметр, имеющий тип T с ненулевым значением — можно вытащить из него через рефлексию (но это может быть тип-наследник).

      К слову (извините, если не по теме), в Kotlin это сделать можно: https://stackoverflow.com/questions/4594958...-in-kotlin-work
        Спасибо!
          Цитата Leklerk @
          Добрый день! Есть класс DataTemplateJdbc<T>, нужно внутри него (например, в конструкторе) получить Class для типа <T>. Подскажите пожалуйста, как это сделать (и можно ли)?

          В Java возможно получить объект типа Class для параметра типа <T> внутри обобщенного класса DataTemplateJdbc<T>. Для этого можно использовать механизм рефлексии.
          Вот пример, как это можно сделать:
          ExpandedWrap disabled
            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> будет наследоваться от другого класса или расширять другой обобщенный класс, иначе, этот подход может не сработать.

          Примечание: Необходимо быть осторожным при использовании рефлексии, так как она может быть сложна в поддержке и потенциально опасна. Рассматривайте альтернативные подходы, если возможно, перед использованием рефлексии в своем коде.
          Сообщение отредактировано: MaIron -
            Здравствуйте! Спасибо за ответ. Но я протестировал - даже если для класса 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".
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0460 ]   [ 15 queries used ]   [ Generated: 28.05.24, 02:23 GMT ]