gpt4 book ai didi

java - 为什么a(Map对象)的值的数据类型改变了?

转载 作者:行者123 更新时间:2023-12-01 14:31:38 25 4
gpt4 key购买 nike

我的 Controller 中有一个 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正常值?

最佳答案

您操纵 map 值的方式已被破坏。您已设置字符串值 "true"而不是 boolean 文字 true 。它通过了参数化泛型类型约束只能意味着它是通过反射完成的。考虑到这个问题是在 JSF 上下文中提出的,这又意味着您正在使用 JSF 标签和 EL 在 View 端操作 map 的值。在这种情况下,您不应指定 "true"在 EL 中,而是 #{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> 来代替),而且在功能上也是错误的,因为它将项目值指定为纯字符串而不是真正的 boolean 值。在此构造中,EL 将无法自动将这些字符串强制转换为 boolean 值,因为映射值的参数化通用类型信息在运行时不可用。 EL 不知道映射值是 boolean 值并且没有显式 converter ,因此它将把未转换的纯字符串提交值放在那里。

修复方法是在 EL 上下文中将它们显式指定为 boolean 值:

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

另请参阅:

关于java - 为什么a(Map对象)的值的数据类型改变了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16832114/

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