【问题标题】:ClassCastException Java with list iterator带有列表迭代器的 ClassCastException Java
【发布时间】:2013-07-22 11:33:30
【问题描述】:

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

我有一个模型类

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
}

带有 MyObject 类型参数的类

public class FooClass implements Serializable{
    private static final long serialVersionUID = 1L;
    private List<MyObject> list;
    // + getters and setters
}

我还有一个使用 MyObject 的类

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
        }
    }
    ...
}

我的对象使用以下代码显示在 JSF 视图中:

<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

大家有什么建议吗?

【问题讨论】:

  • 报错说明List包含String类型,你正在尝试强制转换为“MyObject”
  • 您是否不小心将 Fooclass.list 用作原始 List 某处?这将允许您向myList 插入一个字符串。
  • 您显示的代码不能抛出该异常。其他地方有问题。你如何填充FooClass.list
  • 能否提供完整代码?似乎您正在列表中添加字符串元素,因此出现异常。
  • 事实上,我正在使用 JSF 填写此列表。合成器是一个primefaces selectCheckboxMenu。因此,如果它包含一个字符串,则来自这里。我会这样搜索。

标签: java jsf iterator classcastexception


【解决方案1】:

这是因为 HTTP 协议的“设计”:当请求发送到服务器时,所有数据都以Strings 发送。因此,JSF 也将它们解释为Strings,因为您没有明确告诉预期的对象属于您的特定类,在您的情况下为MyObject。发生这种情况是因为处理所有视图模型通信的 EL 是基于反射的,并且您知道 Java 中的泛型是由于类型擦除导致的编译时现象:泛型信息在运行时不可用。

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

要解决这种情况,您需要明确告诉 JSF 使用 Converter(通过指定 converter 属性,或通过嵌套 &lt;f:converter&gt; 标记),或者改为切换到普通数组(到 MyObject[]List&lt;MyObject&gt;.

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

【讨论】:

  • 非常感谢!使用转换器。而且反应非常明确!
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2013-05-26
  • 2016-04-17
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多