JDK7中菱形界面的意外行为
我的JSF托管bean中有一个属性:
private List selectedDataSets;
我在其他方法中初始化列表如下:
ArrayList longList = new ArrayList();
发生的事情是我得到java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
当java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
跳转到这个foreach时,它java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
:
for (Long CRC : selectedDataSets) { ... }
这很奇怪。 调试显示selectedDataSets
充满了String
值,但我认为甚至不可能。 请描述一下这里究竟发生了什么。
显然,您将属性绑定到UISelectMany
组件,如
或
而不显式指定Converter
。 在Java中, generics类型在运行时被擦除 ,而JSF(更具体地说,EL)根本不知道有关generics列表类型的任何内容,默认为String
除非Converter
另有说明。 它是String
因为它只是HttpServletRequest#getParameterMap()
的默认值类型。 EL通过reflection填充列表中的提交值,并且不考虑任何generics类型。
所以,例如,在内置的LongConverter
帮助下,这应该为你做:
也可以看看:
- 在h:selectManyCheckbox中使用enum
请注意,这与Java 7的钻石操作符无关。 当您尝试使用new ArrayList
时,您会遇到完全相同的问题。