Java - 使用参数获取<class?=“”extends =“”superclass =“”>的抽象类实例

时间:2015-11-22 13:47:11

标签: java enums instance

如果标题相当模糊,请原谅。

请允许我详细说明我的问题:

想象一下,我有一个名为&#34; Car&#34;的类,它是一个抽象类。 现在假设我有多个Car实例,例如奥迪,沃尔沃,法拉利等。

我想将这些实例存储在枚举类中,因此我可以通过枚举轻松检索它们。然而,问题是每个实例在其构造函数中都有一个参数,我不能把它作为枚举中的最终属性。 我需要获取从.class创建的超类(带有1个参数)的实例。

伪码

/* This is my super class */
public abstract class Car{
   public Car(Object param){ }
}

/* This is my instance */
public class Volvo extends Car{ 
   public Volvo(Object param){
      super(param);
   }
}

/* This is my other instance */
public class Ferrari extends Car{ 
   public Ferrari(Object param){
      super(param);
   }
}

上面的代码是我所制作的类的正确显示。 好吧,现在是枚举类:

public enum CarType{

   VOLVO(Volvo.class), FERRARI(Ferrari.class);

   private Class<? extends Car> instance;
   private CarType(Class<? extends Car> instance){
       this.instance = instance;
   }

   /* This is what I tried, NOT working*/
   public Car getCarInstance(Object param){
       try{
          return Car.class.getConstructor(instance).newInstance(param);
       }catch(Exception e){
          /* I didn't do bugmasking, but all the exceptions would 
          make this  post look messy.*/
       }
   }
}

我需要的是: 如果我打电话给CarType.VOLVO.getCarInstance(&#34;我的参数值&#34;); &#39; 它与新沃尔沃相同(&#34;我的参数值&#34;);&#39;

提前致谢。

2 个答案:

答案 0 :(得分:0)

在尝试以下的getCarInstance更改行中:

return instance.getConstructor(Object.class).newInstance(param);

答案 1 :(得分:0)

您不需要Car.class,因为您已在枚举构造函数中指定了类型。顺便说一句,不要将其称为 instance ,将其称为 type

我们走了:

public Car getCarInstance(Object param) {
    try {
        return type.getConstructor(Object.class).newInstance(param);
    } catch (ReflectiveOperationException e) {
        throw new IllegalStateException(e);
    }
}

第二件事(如您所见)是,如何检索正确的构造函数。如果您想了解更多信息,请详细了解reflection