[英]Downcasting from Object to Integer Runtime Error: java.lang.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.