Java 从“通用”列表创建自定义对象列表;“对象”;获取ClassCastException
我有这样的代码:Java 从“通用”列表创建自定义对象列表;“对象”;获取ClassCastException,java,list,object,Java,List,Object,我有这样的代码: public void success(List<Object> profiles, Response response) { List<MyCustomObject> list= new ArrayList<MyCustomObject>(); for (Object profile : profiles) { list.add((MyCustomObject) profile); // t
public void success(List<Object> profiles, Response response) {
List<MyCustomObject> list= new ArrayList<MyCustomObject>();
for (Object profile : profiles) {
list.add((MyCustomObject) profile); // this line crashes
}
}
public void成功(列表配置文件、响应){
列表=新的ArrayList();
用于(对象配置文件:配置文件){
list.add((MyCustomObject)profile);//此行崩溃
}
}
所以我在上面提到的第行得到了一个ClassCastException
。我能做这个吗
下面是我要做的,我真正的代码有点复杂:
我有一个列表
,其中包含两种类型的对象。因此,我使用对象
来保存这两个对象。然后,一旦我从服务器收到这个列表,我想将列表分成两个自定义对象列表(例如,list
,而不是list
。因此我在我的For
循环中进行上述转换,以便将传入的通用对象存储到其特定类型的对象列表中
还有其他方法吗?我走对了吗?你应该在演员阵容之前添加一个安全检查,以防止代码崩溃
List<MyCustomObject> list= new ArrayList<MyCustomObject>();
int index = 0;
for (Object profile : profiles) {
// Safety check before casting the object
if (profile instanceof MyCustomObject) {
list.add((MyCustomObject) profile); // wont crash now
} else {
// other type of object. Handle it separately
}
}
List List=new ArrayList();
int指数=0;
用于(对象配置文件:配置文件){
//铸造物体前的安全检查
if(MyCustomObject的配置文件实例){
list.add((MyCustomObject)profile);//现在不会崩溃
}否则{
//其他类型的对象。单独处理它
}
}
使用“instanceof”运算符来确定哪个对象类型和路由到正确的列表。也许这会使设计的有效性得到验证?如果我理解正确,不如声明两种列表类型,而不是强制转换,使用一些条件,然后填充适当的列表?@SandepChatterjee这正是我试图做的,并且正在做的。但是我的执行是有缺陷的。但是除了强制转换之外,我还需要instanceof
。假设这两种类型是相关的,创建一个profile
接口,这两种类型都可以实现。在接口中添加一个enum
类型来区分这两种类型。另外,我建议不要使用“generic”一词一般来说,它在Java中有一个特殊的含义。调用普通对象对象就足够了,而且不含糊。虽然代码解决了您眼前的问题,但如果您传递对象,并使用instanceof
接口和将其装箱,那么您的设计问题似乎更大e> 抽象类
是你的朋友:)我同意@Paul的观点。你应该考虑一下你的设计。好吧,好吧,我会把这个标记为正确的,因为它确实与我关于撞车的问题直接相关,它解决了这个问题。但我不认为我能使用它,因为我的设计问题。我对Java的了解还不够,无法像@Paul所说的那样实现它,所以我必须做一些更基本、更孤立的事情。可能需要两个async
网络调用来获取两个单独的列表,而不是一个网络调用和一个混合对象
类型的列表。如果您有时间,请看一看:花一点时间学习Java的一些核心概念将在将来为您节省大量时间和麻烦。祝你好运