2016-12-29 42 views
0

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

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

每个命令具有多个OptionsDefinition<T> S的选项名称到使用Consumer<T>物体的方法相关联的参考(T是类的命令的:排序例如)。

我要让引用的方法为了能够调用两次相同的命令在我的壳没有混合在同一个命令的属性值,所以我需要传递sortthis的非静态Consumer<sort>在我的sort命令的例子中。

我想知道我怎么能改造一下我:

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

到:

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

能够使用

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

是否有可能做所以?

+0

如果你只有一个'sort'的实现,我只需要使用那一个实现,不需要查看它。如果你有多个实现,我会使用一个强制转换。 –

回答

1

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

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

然后,你可以写

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

注:

  • 类中的首字母大写
  • 列表是由非负数订购和索引的集合。在Java中,你可以调用由一个键索引的集合,一个Map。
  • 由于编译器不知道转换是否安全,您将在该方法中获得未经检查的转换警告。你可以做些什么来关闭它是

要压制警告。

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

在执行'return(C)commands.get(name);'时,我得到了一个未经检查的强制转换警告? – MaxV37

+0

@ MaxV37是的。编译器不知道演员是否安全。只有你这样做。 –

+0

@ MaxV37您可以取消警告,参见上文。 –