我正在Java中构建一个命令行应用程序,它具有动态的参数列表,具体取决于第一个选择的参数。
java -jar cli.jar --optimizer DifferentialEvolution [optimizer options]
通过实现接口InterfaceOptimizer
定义此应用程序中的优化器。使用reflections库我正在查找此接口的所有子类型,并选择与命令行中给出的名称匹配的那个。
优化程序的每个实现都有不同的参数,这些参数标有注释@Parameter(name = 'cli-name', description = "Some option")
。参数可以是易于处理的简单类型或复杂类型。对于所有复杂类型,我需要执行与优化器相同的子类型查找:
public static Map<String, Class<? extends InterfaceOptimizer>> createOptimizerList() {
Map<String, Class<? extends InterfaceOptimizer>> optimizerList = new TreeMap<String, Class<? extends InterfaceOptimizer>>();
Reflections reflections = new Reflections("eva2.optimization.strategies");
Set<Class<? extends InterfaceOptimizer>> optimizers = reflections.getSubTypesOf(InterfaceOptimizer.class);
for(Class<? extends InterfaceOptimizer> optimizer : optimizers) {
// We only want instantiable classes
if(optimizer.isInterface() || Modifier.isAbstract(optimizer.getModifiers())) {
continue;
}
optimizerList.put(optimizer.getSimpleName(), optimizer);
}
return optimizerList;
}
由于java无法处理动态泛型(Class type = Foobar.class; Class<? extends type>
),我需要另一种方法来执行查找,因此不必为所有可参数化的复杂类型实现上述方法。
有什么建议吗?
答案 0 :(得分:0)
给定的代码是完全正确的,应该按原样运行。有关更详细的解答,请提供运行时错误或编译器警告/错误。