gpt4 book ai didi

java - 带有列表迭代器的 ClassCastException Java

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:39 25 4
gpt4 key购买 nike

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

我有一个模型类

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 View 中:

<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

有什么建议吗?

最佳答案

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

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

要解决这种情况,您需要明确告诉 JSF 使用 Converter (通过指定 converter 属性,或嵌套 <f:converter> 标签),或切换到普通数组(到 MyObject[] )而不是 List<MyObject> .

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

关于java - 带有列表迭代器的 ClassCastException Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17786515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com