繁体   English   中英

Java-通过获取抽象类的实例 <class ? extends SuperClass> 带参数

[英]Java - Get instances of abstract class by <class ? extends SuperClass> with parameters

如果标题含糊不清,请问。

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

想象一下,我有一个名为“ Car”的类,它是一个抽象类。 现在,假设我有多个Car实例,例如Audi,Volvo,Ferrari等。

我想将这些实例存储在枚举类中,这样我就可以轻松地通过枚举检索它们。 但是,问题在于,每个实例的构造函数中都有一个参数,因此我不能将其作为枚举的最终属性。 我需要获取从.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(“ My parameter value”); '它将与'new Volvo(“ my parameter value”);'相同。

提前致谢。

在getCarInstance更改行后,尝试执行以下操作:

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

您不需要Car.class因为您已经在枚举构造函数中指定了类型。 顺便说一句,不要叫它实例 ,叫它type

开始了:

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

第二件事(如您所见)是如何检索正确的构造函数。 如果您想了解更多信息,请阅读更多有关反射的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM