我在Java webapp中创建了一个枚举类型,作为抽象向会话属性添加对象的过程的一种方式。如果我尝试将错误的对象类型映射到特定键,那么这个想法就会产生错误。枚举代码如下所示:
public enum SessionVariables
{
CURRENT_BRIEF {
@Override
public <Briefable> void setValue(Briefable item)
{
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(this.toString(), item);
}
@Override
@SuppressWarnings("unchecked")
public <Briefable> Briefable getValue()
{
return (Briefable) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(this.toString());
}
};
public abstract <T> void setValue(T item);
public abstract <T> T getValue();
}
到目前为止一切都很好,没有编译问题。
但是,如果我实际尝试使用错误类型的方法,编译器不会发现错误,例如:
SessionVariables.CURRENT_BRIEF.setValue("String value");
正常编译。
为什么会出现这种情况?我错过了什么吗?我在Windows 7机器上使用Java SE 8,EE7。
答案 0 :(得分:3)
声明的CURRENT_BRIEF
类型为SessionVariables
。该类型具有方法<T> void setValue(T item)
,并且您的方法调用符合该签名。
此外,当你写了
public <Briefable> void setValue(Briefable item)
你基本上重申了同样的事情,只是命名你的类型参数Briefable
。实际类型仍将从调用上下文中推断出来,这意味着Briefable
会针对该调用解析为String
。