带有列表迭代器的ClassCastException Java

带有列表迭代器的ClassCastException Java,java,jsf,iterator,classcastexception,Java,Jsf,Iterator,Classcastexception,我的代码中有一个非常奇怪的错误。我从项目一开始就在使用迭代器,我从来没有遇到过问题,但在这里我无法理解到底发生了什么 我有一个模型班 public class MyObject implements Serializable{ private static final long serialVersionUID = 1L; private int field1; private String field2; private List<OtherObject

我的代码中有一个非常奇怪的错误。我从项目一开始就在使用迭代器,我从来没有遇到过问题,但在这里我无法理解到底发生了什么

我有一个模型班

public class MyObject implements Serializable{
    private static final long serialVersionUID = 1L;

    private int field1;
    private String field2;
    private List<OtherObject> field3;
    private Date field4
    ...
    // + Getters and setters
    // + Override equals method
}

有什么建议吗?

这是因为HTTP协议的“设计”:当请求被发送到服务器时,所有数据都以
字符串的形式发送。因此,JSF也将它们解释为
String
s,因为在您的例子中,
MyObject
没有明确地告诉您期望的对象是您的特定类。这是因为处理所有视图模型通信的EL基于反射,并且您知道Java中的泛型是编译时现象,因为类型擦除:泛型信息在运行时不可用

因此,基本上在您提交表单之后,您的列表由普通的
String
对象组成,而不是您的
MyObject
实例,正如您所期望的那样:在表单提交之后,通用信息被JSF EL替换。这就是为什么会出现
ClassCastException
。如果在action(listener)方法或setter方法上设置断点,则可以自己检查列表中包含的元素类型

要解决这种情况,您需要明确告诉JSF使用
转换器(通过指定
转换器
属性,或者通过嵌套
标记),或者通过切换到普通数组(到
MyObject[]
)而不是
列表


您可以在我对问题的回答中找到更多信息和一些解决方案。

错误显示列表包含字符串类型,并且您正试图强制转换为“MyObject”,您是否意外地将Fooclass.List用作原始
列表
?这将允许您在
myList
中插入一个字符串。您显示的代码不能引发该异常。别的地方有点不对劲。如何填充
FooClass.list
?能否提供完整的代码?似乎您正在列表中添加字符串元素,因此出现了异常。事实上,我正在用JSF填充此列表。组件是一个primefaces SelectCheckBox菜单。因此,如果它包含一个字符串,则来自这里。我会往这边找的,非常感谢!使用转换器。而且反应非常清楚!
public class FooClass implements Serializable{
    private static final long serialVersionUID = 1L;
    private List<MyObject> list;
    // + getters and setters
}
public class MyController {
    .....
    public static void AMethod(FooClass value) {
        List<MyObject> myList = value.getList();
        Iterator<MyObject> iterator = myList.iterator();
        while(iterator.hasNext()) {
            MyObject temp = iterator.next();  // error on this line
        }
    }
    ...
}
<p:selectCheckboxMenu value="#{fooClass.list}">
    <f:selectItems value="#{fooClass.listAll}" var="obj" 
                   itemValue="#{obj}" itemLabel="#{obj.field2}" />
</p:selectCheckboxMenu>
java.lang.ClassCastException: java.lang.String cannot be cast to com.MyObject