2014-11-21 42 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()