java - JDK7 中菱形接口(interface)的意外行为

标签 java jsf

我的 JSF 托管 bean 中有一个属性:

private List<Long> selectedDataSets;

我在另一个方法中像这样初始化列表:

ArrayList<Long> longList = new ArrayList<>();

当它跳到这个 foreach 上时,我得到了 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long:

for (Long CRC : selectedDataSets) { ... }

这很奇怪。调试显示 selectedDataSets 充满了 String 值,但我认为这是不可能的。请描述一下这里到底发生了什么。

最佳答案

显然您将该属性绑定(bind)到 UISelectMany 类似 <h:selectManyCheckbox> 的组件或 <selectManyListbox> 没有明确指定 Converter .在 Java 中,generic typeerased在运行时和 JSF(更具体地说,EL)根本不知道通用列表类型,默认为 String 除非 Converter 另有说明.这是 String 因为这只是 HttpServletRequest#getParameterMap() 的默认值类型. EL 用 reflection 提交的值填充列表并且不考虑任何通用类型。

因此,例如这应该在内置 LongConverter 的帮助下为您完成:

<h:selectManyCheckbox value="#{bean.selectedDataSets}" converter="javax.faces.Long">

另见:


请注意,这与 Java 7 的菱形运算符无关。当您尝试使用 new ArrayList<Long>() 时,您会遇到完全相同的问题。 .

关于java - JDK7 中菱形接口(interface)的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986404/

相关文章:

java - XMLEncoder 无法正确写入文件

java - Android:目标SIM卡/来电号码

java - 如何在HTML页面中绘制时序图

javascript - 如果在 primefaces 数据表中添加新行,如何检测表单的变化

jquery - 如何将 JSF 的 jQuery 库包含在 Primefaces UI 中?

JSF-战斧 t :panelGrid styling

java - Apache HTTP Server 背后的 Glassfish Server Webservice

java - 计算 java 8 流中通过和失败的谓词

java - 具有数组/列表值的枚举

java - 有什么方法可以用一种动态类实例化的形式来简化这个?