Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2011, 22:27   #1
marry-merry-man
Новичок
Джуниор
 
Регистрация: 07.08.2011
Сообщений: 2
По умолчанию инициализация generic type

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

Уже несколько дней не могу решить проблему инициализации 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 программист. Очень нужно быстро въехать в проект и кое-что дописать.

Заранее благодарность за дельные советы.

Последний раз редактировалось alexinspir; 08.08.2011 в 04:32.
marry-merry-man вне форума Ответить с цитированием
Старый 08.08.2011, 05:37   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

За более чем два года работы с Java я впервые встречаюсь с подобным использованием дженериков.
На сколько мне известно дженерики ведут себя как дженерики только на этапе компиляции (по причине совместимости со старыми версиями).

В вашем случае наиболее оптимальным решением будет передавать объект класса V (SomeClass.class) в конструктор. Однако, замечу что рефлексия является крайне медленным механизмом(например, вызов метода через рефлексию происходит в среднем в 10 раз медленнее прямого вызова).

Обратите особое внимание на первую ссылку.
http://en.wikipedia.org/wiki/Generic...a#Type_erasure
http://habrahabr.ru/blogs/java/66593/
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 08.08.2011 в 07:46. Причина: Добавлены ссылки
alexinspir вне форума Ответить с цитированием
Старый 08.08.2011, 12:11   #3
marry-merry-man
Новичок
Джуниор
 
Регистрация: 07.08.2011
Сообщений: 2
По умолчанию

в принципе, где это возможно я и передаю объект в конструктор.

По сути, у меня следующая проблема:
Есть проект на Spring MVC. Нужно добавить форму добавления транспорта.

Вот код в контроллере
Код:
@RequestMapping(value = "/vehicle/add", method = RequestMethod.POST)
	public String addVehicle(@ModelAttribute("vehicle")VehicleForm(Truck),BindingResult result){...
}
при попадании в метод добавления выскакивает эксепшин о том, что в VehicleForm не инициализировано поле vehicle. Может как-то можно хэндлить вызов метода контроллера и инициализировать VehicleForm?

У тебя есть опыт разработки, может сталкивался с такой ситуацией?

Последний раз редактировалось alexinspir; 09.08.2011 в 09:41.
marry-merry-man вне форума Ответить с цитированием
Старый 09.08.2011, 10:07   #4
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Код который вы дали не коррктен с точки зрения синтаксиса(синтаксис параметра). возможно вы имели ввиду следующий код:
Код:
@RequestMapping(value = "/vehicle/add", method = RequestMethod.POST)
public String addVehicle(@ModelAttribute("vehicle")VehicleForm<Truck> vehicleForm,BindingResult result){
//...
}
Я со спринг MVC не работал, только пробовал его на вкус года полтора назад и почти все из него забыл. но я не вижу всего вашего кода и не знаю что вас ограничивает(и ограничивает ли вообще), чтобы понять контекст проблемы.

вижу несколько возможных вариантов:
1.если доступно место инициализации объекта vehicleForm, то там же и инициализовать необходимое свойство класса(может потребоваться необходимость дописать методы в VehicleForm для этого).
2.если есть возможность редактировать тело метода addVehicle, то можно прямо в нем создать экземпляр класса Truck, так как нам известен класс, и инициализовать нужную переменную в vehicleForm.

Я немного знаком со Spring Core IoC, и как я понял, если метод addVehicle вызывается изнутри фреймворка, типы входящих в него переменных не параметризированы. Т.е. как мне кажется в данном случае код будет компилироваться, но в рантайме должен выбрасывать ошибки.

К сожалению, у меня недостаточно квалификации чтобы вам полноценно помочь.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 09.08.2011 в 10:14.
alexinspir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Could not convert variant of type (Olestr) into type (Double) java_91 Общие вопросы Delphi 1 18.02.2011 18:46
The type name 'GreenShalControl' does not exist in the type Beton_net WPF, UWP, WinRT, XAML 0 15.02.2011 11:24
Could not convert variant of type (UnicodeString) into type (Double) postaveche БД в Delphi 11 13.12.2010 16:41