我的 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 type是erased在运行时和 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/