JDK7中菱形界面的意外行为

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

private List selectedDataSets; 

我在其他方法中初始化列表如下:

 ArrayList longList = new ArrayList(); 

发生的事情是我得到java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Longjava.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()时,您会遇到完全相同的问题。