有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

shell java:动态类转换

我正在用java编写一个shell实现,它支持通过将Command对象添加到Map<String, Command>并编写与此命令关联的类来添加新命令

commandList.put("sort", new sort()); // sort extends Command

每个命令都有多个OptionsDefinition<T>,它们使用Consumer<T>对象将选项名与方法引用相关联(T是命令的类:例如sort)

我想使引用的方法非静态,以便能够在shell中调用同一命令两次,而不混合同一命令属性的值,因此在我的sort命令示例中,我需要将类型为sortthis传递给Consumer<sort>

我想知道如何改变我所拥有的:

Command sort = commandList.getCommand("sort");

为此:

sort sort = commandList.getCommand("sort");

能够使用

option.getCallback().process(sort); // sort is the reference to this

有可能吗


共 (1) 个答案

  1. # 1 楼答案

    可以使用隐式强制转换实现getCommand

    public <C extends Command> C getCommand(String name) {
        return (C) commands.get(name);
    }
    

    然后你就可以写了

    Sort sort = commandMap.getCommand("sort");
    

    注:

    • 课程以滴定酶的形式进行
    • 列表是按非负数排序和索引的集合。在Java中,您可以调用由键索引的集合,即映射
    • 由于编译器不知道强制转换是否安全,因此您将在方法中得到一个未经检查的强制转换警告。要关闭此功能,您可以执行以下操作:

    取消显示警告

    public <C extends Command> C getCommand(String name) {
        @SuppressWarning("unchecked")
        C c = (C) commands.get(name);
        return c;
    }