如何在声明具有两个接口的泛型类型参数时避免不必要的强制类型转换



为什么我必须在下面的代码中显式地将command转换为C ?命令实现了可运行和可描述。

@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";
        }
    };
}

我想到的一个解决方法是引入扩展可运行和可描述的命令:

public interface ICommand extends Runnable, Describable{}

,但是当已经有两种类型可用并且我已经有一个稍微复杂的Command类时,我试图避免引入一个新类型。我是在抓救命稻草吗?

您拥有的是Commands类型的command对象。但是由于你的泛型类型声明<C extends Runnable & Describable>, Java期望C同时是DescribableRunnable,但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);
    }
}

最新更新