簡體   English   中英

Java中的類轉換異常

[英]Class Casting Exception in Java

我在將類彼此轉換時遇到問題。

為了更詳細地解釋它,請看一下這張圖片。

圖片

在我的代碼中,我執行SkillBase s = new SkillBase(); 然后在該類中設置一些值。 然后我嘗試做Subclass sub = (Subclass)s; 但是運行時會給出ClassCastException。

我添加了一個小的調試部分,該部分檢查它的instanceof是否返回true。

我已經嘗試過Google,在這里也看到了一些問題並閱讀了它們(沒有一個答案適合我)

那么,我該怎么辦?

SkillBase不是Subclass的實例,那么您為什么認為強制轉換會起作用? 試試這個:

SkillBase s = new Subclass();
Subclass sub = (Subclass)s;

將會成功。 另外我認為您對instanceof並不正確,我可以確定:

s instanceof Subclass

在上面的代碼中產生true ,但在您的情況下產生false

用現實世界來思考:因為每只狗都是動物* ,所以您總是可以將DogAnimal * ,但是由於某些動物不是狗,因此將AnimalDog可能會失敗。

*實際上,編譯器會為您執行此操作,這被稱為多態

您只能向上廣播,即將子類分配給超類引用。 這樣考慮: Subclass Superclass通過添加新方法f()擴展了Superclass 現在, Superclass對f()一無所知,因此也不知道問題所在。

您可能使用了instanceof錯誤。

由於SkillBase不是Subclass ,因此運行時很容易崩潰。

反之亦然。

s不能轉換為Subclass,因為它沒有實例化為Subclass。 這是一個技能庫。 如果要使用子類,為什么不實例化它?

Subclass s = new Subclass();

您仍然可以設置所需的參數,因為它們已由Skillbase繼承,並且不再需要強制轉換。

問題是您沒有正確使用投射。 始終可以將一個類強制轉換為其父類,但反之則不能。 概念是子類(按定義)知道父級的結構,並且(按定義)已經支持父級中的所有簽名。 因此,父母是孩子的子集。

但是,反事實並非如此。 父類對子類一無所知,並且/或者子代是否對其結構添加了額外的簽名。 因此,沒有辦法告訴編譯器將父級視為子級,並使子級在父級中擁有的所有方法可用。

通俗地說,水(孩子)是液體(父母),但並非所有液體都是水。 因此,您要在液體上進行的任何測量(即:數量,粘度等)也適用於水,但反之亦然(例如:水的密度與油的密度完全不同)。

因此,為了使這一切回到您的情況,您可以將SubclassSkillbase不行。

Subclass instanceof Skillbase == true
(Skillbase) new Subclass() - also valid
(SKillbase) new Sub#2 - also valid

等等...

暫無
暫無

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

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