2014-11-21 26 views
0

我受够了一个错误,并陷入了一个问题,我猜Java在Java中是向下转换的。下面的代码:Java downcasting ClassCastException错误

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 
} 

程序抛出ClassCastException异常,当我尝试使用意达的副本(..)在这里:

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

有很多类,比如意达相似的结构,每个都有自己的Thingx领域。

任何人都可以请帮我解决如何改变它使其工作?

回答

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实现可复制

public interface Copyable { 

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

的界面,你可以在任何类中定义他们必须从复制(它更polimorfic和OO)的方式。

0

form.getTempObject()还返回一个ItemA类的实例吗?
这是你能够将它传递给ItemA.copy()方法的主要条件,并且能够将它投射到ItemA

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