我遇到了一个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字段。
有人可以帮我解决一下如何改变它以使其有效吗?
答案 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
的主要要求。
仅因为itemToEdit
是ItemA
的实例,并不能保证传递给copy()
方法的参数也是ItemA
。
itemToEdit
的实例ItemA
会导致调用ItemA.copy()
方法,而不是ComItem.copy()
。