为什么我必须在以下代码中将命令显式地转换为C? 命令实现Runnable和Describable。
@Test
public <C extends Runnable & Describable> void testMapOfCommands() throws Exception
{
Map<String, C> commands = Maps.newHashMap();
for(Commands command : Commands.values())
{
commands.put(command.name(), (C) command);
}
//Use commands here (not relevant to my question):
//CommandLineParser.withCommands(commands).parse("commit");
}
private enum Commands implements Runnable, Describable
{
commit
{
@Override
public void run()
{
System.out.println("COMMIT");
}
@Override
public String description()
{
return "Commits something";
}
};
}
我想到的一个解决方法是引入扩展Runnable和Describable的ICommand:
public interface ICommand extends Runnable, Describable{}
但是我试图避免在已经有两种类型可用时引入新类型并且我已经有一个更复杂的Command类。我在这里抓稻草吗?
答案 0 :(得分:6)
您所拥有的是command
类型为Commands
的对象。但由于您的泛型类型声明<C extends Runnable & Describable>
,Java期望C
同时为Describable
和Runnable
,但C
不一定是Commands
这种特殊的测试方法并不适用于除Commands
以外的任何其他方法,因此它不应该是通用的。这应该有效:
public void testMapOfCommands() throws Exception
{
Map<String, Commands> commands = new HashMap<String, Commands>();
for(Commands command : Commands.values())
{
commands.put(command.name(), command);
}
}