JDK7中菱形界面的意外行为

时间:2011-11-02 19:43:52

标签: 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个值,但我认为这甚至不可能。请描述一下我在这里发生了什么。

1 个答案:

答案 0 :(得分:4)

显然,您已将该属性绑定到UISelectMany组件,例如<h:selectManyCheckbox><selectManyListbox>,而未明确指定Converter。在Java中,generic type在运行时期间是erased,而JSF(更具体地说,EL)根本不知道关于通用列表类型的任何内容,默认为String,除非{ {3}}。它是Converter,因为这只是String的默认值类型。 EL使用HttpServletRequest#getParameterMap()提交的值填充列表,并且不考虑任何泛型类型。

所以,例如,在内置reflection的帮助下,这应该为你做到:

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

另见:


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