簡體   English   中英

Java向下轉換ClassCastException錯誤

[英]Java downcasting ClassCastException error

我承擔了一個錯誤的任務,並且陷入了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的copy(..)時,程序將引發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字段。

有人可以幫我解決如何更改它以使其正常工作的解決方案嗎?

在代碼中,您檢查了使用層次結構的類中的類型

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);
....
}

並且您可以在任何類中定義它們必須從中進行復制的方式(這是更復雜的和面向對象的)。

form.getTempObject()還返回ItemA類的實例?
這是主要的需求,為您能夠將它傳遞給ItemA.copy()方法,並能夠里面丟,一個ItemA

正因為itemToEdit是實例ItemA不保證傳遞給參數copy()方法也是ItemA
itemToEdit是實例ItemA使ItemA.copy()被調用,而不是方法ComItem.copy()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM