作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用泛型实现一个非常简单的命令模式实现
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/
我是一名优秀的程序员,十分优秀!