您可以用Java反射API做到这一点,利用Class.getConstructor()
和Constructor.newInstance()
方法:
public <T extends MyClassParent> void foo(Class<T> classType) throws Exception {
T instance = (T) classType.getConstructor().newInstance(); // no-args constructor assumed
// work with instance, which is a subclass of MyClassParent
}
这个工作,只要MyClassParent
所有子类有一个无参数的构造函数。如果它们都有另一个构造函数,则可以将期望参数的类传递给Class.getConstructor()
,并将实际参数值传递给Constructor.newInstance()
。有关更多详细信息,请参阅文档。
然而,与Java 8,你能避免使用反射:
Map<String, Supplier<? extends MyClassParent>> facotries = new HashMap<>();
factories.put("MyChosenClassType1", MyChosenClassType1::new);
factories.put("MyChosenClassType2", MyChosenClassType2::new);
// etc
然后,可以按如下方式实现你foo
方法:
public void foo(String classType) {
Supplier<? extends MyClassParent> factory = factories.get(classType);
if (factory != null) {
MyClassParent instance = factory.get();
// work with instance
}
}
这些类是否共享一个通用接口? –
不,但它们是从同一个类扩展而来,比如MyClassParent – SadeepDarshana
这些类的构造函数是什么? –