java:动态类转换

时间:2016-12-29 13:30:07

标签: java shell

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

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

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

我想让方法引用非静态,以便能够在我的shell中调用相同的命令两次而不混合相同命令的属性的值,所以我需要传递{{在我的sort命令示例中,this类型为sort

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

Consumer<sort>

到那个:

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

能够使用

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

是否可以这样做?

1 个答案:

答案 0 :(得分:1)

您可以使用隐式转换实现getCommand。

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

然后你可以写

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

注意:

  • 类在TitleCase
  • List是按非负数排序和索引的集合。在Java中,您可以调用由密钥索引的集合,即Map。
  • 您将在方法中获得未经检查的强制转换警告,因为编译器不知道强制转换是否安全。你可以做些什么来关闭它

禁止警告。

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