3 回答
TA贡献1788条经验 获得超4个赞
感谢您帮助检查有效性(它有效!)但我仍然没有得到这个 newInstance 创建,因为我必须从 .csv 文件中读取数据,而我的派生类实际上是原始类型(如 int、float 等)的“包装器” . 我应该使用方法 getInstance() 和 create(string s) 创建新对象,所以它看起来像这样:
public static class Derived1 extends Base { //Integer wrapper
Integer value;
public Derived1(Integer value) {
this.value = value;
}
private static Integer integer = new Integer();
public static Integer getInstance(){
return integer;
}
private Integer(){};
public Base create(String s) {
value = java.lang.Integer.parseInt(s);
return this;
}
}
而且我不知道如何使用 Class 转换为适当的类型。
TA贡献1887条经验 获得超5个赞
如果我正确阅读了这个问题,那么您想创建一些派生类的实例,它们都具有相同的构造函数参数。如果是这种情况,那么您需要为每个派生类提供相同的构造函数(它不需要在基类中)并使用 Constructor.newInstance(parameters) 创建实例。此外,由于您要确保每个派生类扩展基类,因此您将需要使用 Class.isAssignableFrom(class)。例如,
import java.lang.reflect.Constructor;
public class SO52930530 {
public abstract static class Base {
public abstract <T> T getValue();
}
public static class Derived1 extends Base {
String value;
public Derived1(String value) {
this.value = value;
}
public <T> T getValue() {
return (T) value;
}
}
public static class Derived2 extends Base {
Integer value;
public Derived2(String value) {
this.value = new Integer(value);
}
public <T> T getValue() {
return (T) value;
}
}
public static void main(String... args) throws Exception {
Class<? extends Base>[] extensions = new Class[]{Derived1.class, Derived2.class};
String[] values = new String[]{"a", "1"};
Base[] instances = new Base[values.length];
for (int i = 0; i < instances.length; i++) {
Class extension = extensions[i];
if (Base.class.isAssignableFrom(extension)) {
Constructor constructor = extension.getConstructor(String.class);
instances[i] = (Base) constructor.newInstance(values[i]);
}
}
for (int i = 0; i < instances.length; i++) {
System.out.printf("%d %s %s\n", i, instances[i].getClass(), instances[i].getValue());
}
}
}
我希望这有帮助。
添加回答
举报