Java向下转换ClassCastException错误

时间:2014-11-21 12:18:08

标签: java

我遇到了一个bug,我遇到了一个问题,我猜想在Java中进行低估。这是代码:

public class ComItem {

private String someValue1;
private String someValue2;

public void copy(ComItem temp) {
    this.someValue = temp.someValue1;
    this.someValue2 = temp.someValue2;
}

... getters & setters & etc omitted
}


public class ItemA extends ComItem {

private ThingA thingA;

@Override
public void copy(ComItem temp) {
    super.copy(temp);
    this.thingA = ((ItemA) temp).thingA; // <- **ERROR**
}

... getters & setters & etc omitted
}

当我尝试在这里使用ItemA&#39的副本(..)时,程序抛出ClassCastException:

if (form.getTempObject() instanceof ComItem) {
    ...
    ComItem temp = (ComItem) form.getTempObject();
    ComItem itemToEdit = (ComItem) form.getCurrentEditedObject(); // currentEditedObject is ItemA class
    itemToEdit.copy(temp);
    ...
} 

有许多像ItemA这样的类在结构上类似,每个类都有自己的Thingx字段。

有人可以帮我解决一下如何改变它以使其有效吗?

2 个答案:

答案 0 :(得分:0)

在您的代码中,您检查了使用层次结构的类中的类型

if (form.getTempObject() instanceof ComItem) {

但是tempObject可以是ComItem的任何子类(如果不是抽象,甚至可以是ComItem)。

所以在你的复制方法中,你总是使用ItemA(并且没有检查它的类型),并不总是如此。

我不喜欢instanceOf因为不是OO,但在这种情况下你可以使用它。

@Override
public void copy(ComItem temp) {
    super.copy(temp);
    if (form.getTempObject() instanceof ItemA) {
        this.thingA = ((ItemA) temp).thingA; // <- **NOW NO ERROR**
    }
}

或另一个替代品,它的ComItem实现了一个接口Copyable

public interface Copyable {

copyFrom(ItemA toCopy);
copyFrom(ItemB toCopy);
copyFrom(ItemC toCopy);
....
}

你可以在任何一个班级中定义他们必须复制的方式(它更像是polimorfic和OO)。

答案 1 :(得分:0)

form.getTempObject()是否也返回ItemA类的实例?
这是您能够将其传递给ItemA.copy()方法并且能够将其转换为ItemA的主要要求。

仅因为itemToEditItemA的实例,并不能保证传递给copy()方法的参数也是ItemA
itemToEdit的实例ItemA会导致调用ItemA.copy()方法,而不是ComItem.copy()

相关问题