2015-09-16 4 views
1

Я хочу использовать родовой тип, который расширяет класс BoostItem до его базового класса BoostItem, а затем вызывает его конструктор (с целым числом). Как я могу это достичь? T всегда должен расширять BoostItem, поэтому всегда должно быть возможно передать аргумент boostFood классу BoostItem, правильно? Что мне здесь не хватает ..?Java Generics Кастинг с расширенным типом

public <T extends BoostItem> void addBoostFood(Class<T> boostFood){ 
     try { 
      // How to cast boostFood to BoostItem 
      // Call constructor of BoostItem with Parameter int 
      ((BoostItem)boostFood).newInstance(5); //Doesnt work 


     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
} 

------------- EDIT Результирующая Исходный код (выглядит некрасиво, и я не думаю, что я буду использовать его как это слишком медленно и unflexible)

public <T extends BoostItem> void addBoostFood(Class<T> boostFood){ 
      try { 
       Constructor[] ctors = boostFood.getDeclaredConstructors(); 
       for(Constructor c : ctors) { 
        Type[] types = c.getGenericParameterTypes(); 
        boolean isRightCon = true; 
        for(Type t : types){ 
         if(t != Integer.class) 
           isRightCon = false;          
        } 
        if(isRightCon) 
         gFoodBoosterList.add((BoostItem) c.newInstance(new Integer(5))); 
        } 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 

ответ

3

Вы пытались направить объект ClassboostFood в качестве объекта BoostItem, а не на результат звонка newInstance.

Во-первых, вы можете перемещать выделение вне круглых скобок, чтобы результат вызова метода был отлит. Но это должно быть ненужным, потому что вы всегда можете назначить объект подкласса для ссылки на суперкласс.

Во-вторых, newInstance method in Class не принимает никаких аргументов. Это метод удобства для класса, который содержит конструкторы без аргументов. Вам необходимо будет получить соответствующий объект Constructor от Class через getDeclaredConstructor, передавая в качестве типа параметра int.class (или Integer.class в зависимости от обстоятельств). Затем вы можете позвонить Constructor's newInstance method, который принимает параметры.

Смежные вопросы