为什么Java编译器不将此标记为错误?

时间:2014-10-22 13:05:31

标签: java generics enums

我在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。

1 个答案:

答案 0 :(得分:3)

声明的CURRENT_BRIEF类型为SessionVariables。该类型具有方法<T> void setValue(T item),并且您的方法调用符合该签名。

此外,当你写了

public <Briefable> void setValue(Briefable item)

你基本上重申了同样的事情,只是命名你的类型参数Briefable。实际类型仍将从调用上下文中推断出来,这意味着Briefable会针对该调用解析为String

相关问题