为什么(Map对象)的值的数据类型发生了变化?

时间:2013-05-30 09:11:29

标签: java jsf data-structures casting hashmap

我的控制器中有Map<String, Boolean>

private Map<String, Boolean> selectedRequestsMap;
selectedRequestsMap = new HashMap<String, Boolean>();

当我把元素添加到其中时(正如Boolean值)

selectedRequestsMap.put(StringValue, booleanValue);

enter image description here 但是当我遍历一个Map来读取值时 它被考虑(作为String值)

// Loop over selectedRequestsMap
for (Map.Entry<String, Boolean> entry : selectedRequestsMap.entrySet()) {
    String key = entry.getKey();
    Boolean value = entry.getValue(); // An Exception is raised 
    // ...  
}

enter image description here 然后当我读取Boolean

An Exception被提出 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean

需要知道
我怎么能正常读取Boolean值?

1 个答案:

答案 0 :(得分:1)

您操纵地图值的方式已被破坏。您已将字符串值设置为"true",而不是布尔文字true。它传递参数化泛型类型约束只能意味着它是通过反射完成的。考虑到在JSF上下文中询问了这个问题,这反过来意味着您正在使用JSF标记和EL操纵视图中的地图值。在这种情况下,您不应在EL中指定"true",而应指定#{true}

您没有在SSCCE风格中显示问题,因此很难指出错误并提供准确的答案。所以,这只是最可能的原因之一:

<h:selectOneRadio value="#{bean.selectedRequestsMap[some.key]}">
    <f:selectItem itemLabel="Yes" itemValue="true" />
    <f:selectItem itemLabel="No" itemValue="false" />
</h:selectOneRadio>

这不仅是设计技术错误(你应该使用<h:selectBooleanCheckbox>代替),但这在功能上也是错误的,因为它将项目值指定为纯字符串而不是真正的布尔值。在此构造中,EL将无法将这些字符串自动强制转换为布尔值,因为在运行时期间,映射值的参数化泛型类型信息不可用。 EL不知道map值是一个布尔值而没有明确的converter,因此它会将普通的未转换字符串提交值放在那里。

然后修复将在EL上下文中明确指定为布尔值:

<h:selectOneRadio value="#{bean.selectedRequestsMap[some.key]}">
    <f:selectItem itemLabel="Yes" itemValue="#{true}" />
    <f:selectItem itemLabel="No" itemValue="#{false}" />
</h:selectOneRadio>

另见: