Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java向下广播ClassCastException错误_Java - Fatal编程技术网

Java向下广播ClassCastException错误

Java向下广播ClassCastException错误,java,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 & se

我接到一个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的类,它们的结构相似,每个类都有自己的Thingx字段


有谁能帮我找到一个解决方案,如何更改它使其工作?

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

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**
    }
}
您可以在任何类中定义它们必须从中复制的方式更具政治性和面向对象性。

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

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

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

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