0

我正在用 Java 构建一个命令行应用程序,它具有取决于第一个选择的参数的动态参数列表。

java -jar cli.jar --optimizer DifferentialEvolution [optimizer options]

此应用程序中的优化器是通过实现接口来定义的InterfaceOptimizer。使用反射库,我正在查找此接口的所有子类型,并选择与命令行中给出的名称匹配的子类型。

优化器的每个实现都有不同的参数,这些参数标有注释@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>),我需要另一种方法来执行查找,因此不必为所有可参数化的复杂类型实现上述方法。

有什么建议吗?

4

1 回答 1

0

给定的代码语法正确,应该可以正常工作。如需更详细的答案,请提供运行时错误或编译器警告/错误。

于 2013-10-24T12:54:47.673 回答