Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация generic type, Проблема инициализации generic'a в конст 
:(
    Опции темы
marrymerryman
Дата 7.8.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.8.2011

Репутация: нет
Всего: нет



Здравствуйте. 

Уже несколько дней не могу решить проблему инициализации generic'а при создании экземпляра класса.

Код

public class VehicleForm<V extends Vehicle>{
private V vehicle;
private Double price;
private Class<V>vItemClass;

public V getVehicle(){
return this.vehicle;
}

public void setVehicle(V vehicle){
this.vehicle=vehicle;
}

public Double getPrice(){
return this.price;
}

public void setPrice(Double price){
this.price=price;
}

private final Class<V> getGenericClassInstance() {
Class<V> persistentClass = null;
Type genericType = getClass().getGenericSuperclass();

if (genericType instanceof ParameterizedType) {
ParameterizedType pType = ((ParameterizedType) genericType);
// obtaining first generic type class
persistentClass = (Class<V>) pType.getActualTypeArguments()[0];
}

return persistentClass;
}

public VehicleForm(){
this.vItemClass=getGenericClassInstance();//vItemClass is null
this.vehicle=this.vItemClass.newInstance();//null poiner exception
}
}


Как я понял, работа с generic'ами в java осуществляется через reflection. чтобы получить список generic параметров, нужно поддерживать интерфейс ParameterizedType. Но по какой-то причине у меня не срабатывает условие
if (genericType instanceof ParameterizedType)
соответственно persistentClass у меня null и невозможно создать экземпляр V в рантайме.

Сразу оговорюсь, что я не java программист. Очень нужно быстро въехать в проект и кое-что дописать. 

Заранее благодарность за дельные советы.
PM MAIL   Вверх
jk1
Дата 7.8.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Generics в существуют только на этапе компиляции, в рантайме их нет. Так что инстанс generic-типа в рантайме не создашь.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
marrymerryman
Дата 7.8.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.8.2011

Репутация: нет
Всего: нет



Цитата(jk1 @ 7.8.2011,  22:08)
Generics в существуют только на этапе компиляции, в рантайме их нет. Так что инстанс generic-типа в рантайме не создашь.

Ну, для для работы с подставленным типом на место generic'а V у меня и используется функция
Код

private final Class<V> getGenericClassInstance() {
Class<V> persistentClass = null;
Type genericType = getClass().getGenericSuperclass();
if (genericType instanceof ParameterizedType) {
ParameterizedType pType = ((ParameterizedType) genericType);
// obtaining first generic type class
persistentClass = (Class<V>) pType.getActualTypeArguments()[0];
}
return persistentClass;
}


я ведь не могу написать

Код

public VehicleForm(){
this.vehicle=new V();
}


это вызовет ошибку компиляции

поэтому нужно через reflection 

Код

public VehicleForm(){
this.vItemClass=getGenericClassInstance();
this.vehicle=this.vItemClass.newInstance();
}


Но у меня возникает nullPointerException, так как функция getGenericClassInstance возвращает Null; не срабатывает условие if (genericType instanceof ParameterizedType) {. Вроде должно срабатывать, так как класс VehicleForm содержит generic-и
PM MAIL   Вверх
Farmazon
Дата 8.8.2011, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 1
Всего: 5



это хак)

не стоит так с Generic извращаться.

Очень сильно подозреваю что у тебя в genericType  - что-то от Object. Проверь во время исполнения, кинь брекпоинт.

Это сообщение отредактировал(а) Farmazon - 8.8.2011, 11:16


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
Farmazon
Дата 8.8.2011, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 1
Всего: 5



Гляди:
Код

        class A<T> {
            
            public void say() {
                System.out.println(this.getClass().getGenericSuperclass());
            }
        };
        A<String> a = new A();
        a.say();


Добавлено через 13 минут и 25 секунд
Если тебе хоть как-то удастся добраться до String - скажи как. +)


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.