Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Generic параметризованный класс. / 25 сообщений из 28, страница 1 из 2
27.08.2008, 12:21:38
    #35508156
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 class  gtest<T> {

      public  T somLogic(){
     // вот в этом месте позарез нужно узнать тип параметризованного класса
     // типа T.class
     }
}
...
Рейтинг: 0 / 0
27.08.2008, 12:53:46
    #35508299
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Erasure можно обойти только так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 class  gtest<T> {

      public  T somLogic(){
     // вот в этом месте позарез нужно узнать тип параметризованного класса
     // типа T.class
              Class  tclass = whatIsMyGenericType();
     }

         Class  whatIsMyGenericType(){
               return   null ;
        }
}



 class  MyTypeGTest  extends  gtest<MyType>
{
         Class  whatIsMyGenericType(){
              return  ReflectionAPI.findTheGenericTypeCode(getClass());
             //Хотя с тем же успехом здесь можно просто вернуть MyType и не извращатся
        }
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 class  gtest<T> {

      public  T somLogic(T instace){
     // вот в этом месте позарез нужно узнать тип параметризованного класса
     // типа T.class
             instace.getClass();
     }
}

Код: plaintext
1.
2.
3.
4.
5.
6.
 class  gtest<T> {

      public  T somLogic( Class <T> clazz){
     // вот в этом месте позарез нужно узнать тип параметризованного класса
     // типа T.class
     }
}
Иначе, ну никак. Его там просто нет.
...
Рейтинг: 0 / 0
27.08.2008, 13:54:36
    #35508523
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Вчера перерыл кучу док, кажется что это достаточно реальная задача, а решения пока не нашел.

Суть дела: пишу DAO для Hibernate. Было бы круто написать одно DAO для всех классов, стандартная логика добавить/удалить/ ... функционал для пейджинга и т.п.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 class  DAO<hbmObject>{
   void  create (hbmObject){...}
   void  load ( Long  id){
  // вот тут как раз и нужен класс объекта 
  session.load(some. class , id)
}

}
в дальнейшем все равно придется для некоторых объектов экстендить дао, но для стандартных функций думал обойдусь одним классом. Единственный вариант который я пока вижу в load передавать инстанс класса, для селекта.
...
Рейтинг: 0 / 0
27.08.2008, 13:55:40
    #35508527
Самоловских Виталий aka Kefir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Generic проверяется на этапе компиляции. В рантайме класс ведет себя как будьто работает с Object, ну или с базовым классом/интерфейсом. Короче тип не знает.
...
Рейтинг: 0 / 0
27.08.2008, 13:57:58
    #35508536
Самоловских Виталий aka Kefir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
ТимоНСуть дела: пишу DAO для Hibernate. Было бы круто написать одно DAO для всех классов, стандартная логика добавить/удалить/ ... функционал для пейджинга и т.п.
Почему бы не создать поле с классом и не передавать его в конструкторе. По моему - единственный верный путь. И не такой тяжелый.
...
Рейтинг: 0 / 0
27.08.2008, 13:58:30
    #35508540
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
ТимоНЕдинственный вариант который я пока вижу в load передавать инстанс класса, для селекта.
Это изврат. Передавай класс и не парься.
...
Рейтинг: 0 / 0
27.08.2008, 14:07:03
    #35508575
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Blazkowicz ТимоНЕдинственный вариант который я пока вижу в load передавать инстанс класса, для селекта.
Это изврат. Передавай класс и не парься.
Почему изврат?
Код: plaintext
1.
2.
3.
  DAO<User> udao =  new  DAO<User>();
  ...
  DAO<SomeOtherObject> sodao =  new  DAO<SomeOtherObject>();

Все красиво получается, до метода load, как раз таки передавать класс в параметризованый класс это изврат. Так несчитаете?
...
Рейтинг: 0 / 0
27.08.2008, 14:07:55
    #35508586
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Самоловских Виталий aka Kefir ТимоНСуть дела: пишу DAO для Hibernate. Было бы круто написать одно DAO для всех классов, стандартная логика добавить/удалить/ ... функционал для пейджинга и т.п.
Почему бы не создать поле с классом и не передавать его в конструкторе. По моему - единственный верный путь. И не такой тяжелый. В данном случае вся прелесть джинериков теряется.
...
Рейтинг: 0 / 0
27.08.2008, 14:33:21
    #35508669
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
ТимоНВсе красиво получается, до метода load, как раз таки передавать класс в параметризованый класс это изврат. Так несчитаете?
Так я ж про load()

load(new User()) vs load(User.class)
...
Рейтинг: 0 / 0
27.08.2008, 14:50:16
    #35508728
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Blazkowicz ТимоНВсе красиво получается, до метода load, как раз таки передавать класс в параметризованый класс это изврат. Так несчитаете?
Так я ж про load()

load(new User()) vs load(User.class)
А да я имел ввиду ваш вариант load(User.class). Затупил.
...
Рейтинг: 0 / 0
27.08.2008, 15:05:02
    #35508773
brut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   abstract   class  CommonEntityDaoManager<T> {
     public  T getById( Long  id) {
        T item;
         Class  genericClassType = getGenericClass();
        Session currentSession = getCurrentSesstion();
        currentSession.beginTransaction();
        item = (T) currentSession.get(genericClassType, id);
        currentSession.getTransaction().rollback();
         return  item;
    }
    
   protected   Class  getGenericClass() {
         return  ( Class ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ];
    }    
}

...
Рейтинг: 0 / 0
27.08.2008, 15:24:16
    #35508840
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
brut
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   abstract   class  CommonEntityDaoManager<T> {
     public  T getById( Long  id) {
        T item;
         Class  genericClassType = getGenericClass();
        Session currentSession = getCurrentSesstion();
        currentSession.beginTransaction();
        item = (T) currentSession.get(genericClassType, id);
        currentSession.getTransaction().rollback();
         return  item;
    }
    
   protected   Class  getGenericClass() {
         return  ( Class ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ];
    }    
}


спасибо, попробую вечером. А зачем вам currentSession.getTransaction().rollback() ?
...
Рейтинг: 0 / 0
27.08.2008, 15:27:43
    #35508859
brut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
закрыть транзакцию. Как-то читал (не помню где) что rollback работает быстее комита, тут комыт не нужен. Если ошибся буду бгагодарен за правки
...
Рейтинг: 0 / 0
27.08.2008, 15:33:42
    #35508880
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
1) Hibernate имеет свойство запускать некоторые апдейты при загрузке объектов.
2) А при декларативном управлении транзакциями это rollback не усрется?
...
Рейтинг: 0 / 0
27.08.2008, 15:35:06
    #35508882
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
brut
Код: plaintext
1.
 public   abstract   class  CommonEntityDaoManager<T> {

Это то что я привел первым примером. Только тогда код вроде new DAO(User) идет лесом.
...
Рейтинг: 0 / 0
27.08.2008, 15:38:07
    #35508891
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Blazkowicz brut
Код: plaintext
1.
 public   abstract   class  CommonEntityDaoManager<T> {

Это то что я привел первым примером. Только тогда код вроде new DAO(User) идет лесом.
Точно, не заметил что он абстрактный. Вопрос остается открытым.
...
Рейтинг: 0 / 0
27.08.2008, 15:43:26
    #35508912
mijer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
...
Рейтинг: 0 / 0
27.08.2008, 15:46:14
    #35508926
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
хотя
getTypeParameters()

Returns an array of TypeVariable objects that represent the type variables declared by the generic declaration represented by this GenericDeclaration object, in declaration order. Returns an array of length 0 if the underlying generic declaration declares no type variables.
...
Рейтинг: 0 / 0
27.08.2008, 15:48:24
    #35508937
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
mijer http://www.hibernate.org/328.html
Хороший тынц.
...
Рейтинг: 0 / 0
28.08.2008, 11:48:27
    #35510429
Cyb
Cyb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
нашлось ли решение? мучаюсь с тем же только на JPA
...
Рейтинг: 0 / 0
28.08.2008, 12:09:29
    #35510500
Cyb
Cyb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
(: похоже придется подождать Java 7

Reified Generics

Currently, generics are implemented using erasure, which means that the generic type information is not available at runtime, which makes some kind of code hard to write. Generics were implemented this way to support backwards compatibility with older non-generic code. Reified generics would make the generic type information available at runtime, which would break legacy non-generic code. However, Neal Gafter has proposed making types reifiable only if specified, so as to not break backward compatibility.

http://tech.puredanger.com/java7#reified
...
Рейтинг: 0 / 0
28.08.2008, 12:47:41
    #35510614
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Cybнашлось ли решение? мучаюсь с тем же только на JPA
вон же тынц на hibernate generic DAO
...
Рейтинг: 0 / 0
28.08.2008, 14:42:37
    #35511065
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
Cyb(: похоже придется подождать Java 7
Спецификации (JSR) на Java 7 нет и в скором времени не предвидится. Лично я на счет генериков сильно сомневаюсь.
...
Рейтинг: 0 / 0
29.08.2008, 18:04:36
    #35513879
tompson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
brutзакрыть транзакцию. Как-то читал (не помню где) что rollback работает быстее комита, тут комыт не нужен. Если ошибся буду бгагодарен за правки
Если говорить про Оракл - то вы совершенно правы.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
26.05.2013, 20:55:01
    #38273955
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Generic параметризованный класс.
brut
Код: java
1.
2.
3.
        currentSession.beginTransaction();
        item = (T) currentSession.get(genericClassType, id);
        currentSession.getTransaction().rollback();



Руки бы пообрывал за такой код
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Generic параметризованный класс. / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]