gpt4 book ai didi

java - 泛型方法上奇怪的 Java 泛型编译器行为

转载 作者:行者123 更新时间:2023-11-30 07:13:51 26 4
gpt4 key购买 nike

我正在尝试使用泛型实现一个非常简单的命令模式实现

public abstract class Command { 
}


public interface CommandHandler<H extends Command> {

boolean isActive();
void execute( H command );

}


public class CommandExecutionServiceImpl implements CommandExecutionService {

private Map< Class<Command>,CommandHandler<Command>> commandMap;


public CommandExecutionServiceImpl(){
commandMap = new HashMap<Class<Command>, CommandHandler<Command>>();
}

@Override
public void executeCommand(Command command) {

CommandHandler<Command> handler = commandMap.get(command.getClass());
handler.execute(command);

}

@Override
public boolean isActive(Command command) {
return false;
}

@Override
public <H extends Command> void addCommandHandler(Class<H> commandClass, CommandHandler<H> handler) {

commandMap.put( commandClass, handler );

}

编译失败

编译失败CommandExecutionServiceImpl.java:[36,12] put(java.lang.Class,CommandHandler) in java.util.Map,CommandHandler>不能应用于(java.lang.Class,CommandHandler)

我无法理解为什么编译器无法在 commandMap.put( commandClass, handler ); 处推断出类型。

如有任何帮助,我们将不胜感激。

最佳答案

看起来您想要 map 的键和值之间的通用关系。如果支持它,它可能看起来像这样:

private <H extends Command> Map<Class<H>, CommandHandler<H>> commandMap;

但这显然是不允许的。解决方法是使用 Josh Bloch 的 Typesafe Heterogeneous Container图案:

private Map<Class<? extends Command>, CommandHandler<? extends Command>> commandMap; 

@Override
public <H extends Command> void executeCommand(H command) {

// addCommandHandler guarantees the safety of this unchecked cast
@SuppressWarnings("unchecked")
CommandHandler<H> handler = (CommandHandler<H>)commandMap.get(command.getClass());
handler.execute(command);
}

关于java - 泛型方法上奇怪的 Java 泛型编译器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19041298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com