Java泛型使用扩展类型进行转换

时间:2015-09-16 22:23:44

标签: java generics casting extends

我想转换一个泛型类型,它将类'BoostItem'扩展到它的基类'BoostItem',然后调用它的构造函数(带一个整数)。我怎样才能做到这一点? T必须始终扩展BoostItem,因此应始终可以将Argument boostFood转换为类BoostItem,对吗? 我在这里错过了什么..?

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();
        }
 }

-------------编辑 产生的源代码(看起来很难看,我认为我不会使用它,因为它太慢而且不灵活)

  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();
                }
            }

1 个答案:

答案 0 :(得分:3)

您试图将Class对象boostFood强制转换为BoostItem个对象,而不是调用newInstance的结果。

首先,您可以在括号外移动强制转换,以便转换方法调用的结果。但这应该是不必要的,因为您总是可以将子类对象分配给超类引用。

其次,newInstance method in Class没有任何参数。这是包含无参数构造函数的类的便捷方法。您需要从Constructor通过Class获取相应的getDeclaredConstructor对象,并将int.class作为参数类型传入(或Integer.class视具体情况而定)。然后你可以调用Constructor's newInstance method,它确实需要参数。