2012-01-27 46 views
0

我在將類之間相互轉換時遇到問題。Java中的類拋出異常

要更詳細地解釋它,請查看此圖像。

The Image

在我的代碼,我做SkillBase s = new SkillBase();,然後設置在類中的一些價值。 然後我嘗試做Subclass sub = (Subclass)s;,但是在運行時它給出了一個ClassCastException。

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

我已經嘗試了谷歌,看到了這裏的一些問題藏漢和閱讀它們(他們都沒有說是爲我一個答案)

那麼,我該怎麼辦?

回答

5

SkillBase不是Subclass的實例,那麼爲什麼你認爲鑄造將會起作用?試試這個:

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

這將成功。此外,我認爲你是不正確的用instanceof,我確信:

s instanceof Subclass 

產生在上面的代碼truefalse你的情況。

在現實世界中來思考:你總是可以投DogAnimal因爲每隻狗是動物*,但鑄造因爲有些動物不是狗AnimalDog可能會失敗。

*事實上,編譯器會爲你,它被稱爲多態性

+0

其實,這就是我正在做的。 Subclass擴展了SkillBase,所以它應該可以被施放嗎? – Lolmewn 2012-01-27 19:02:50

+0

要添加:'Subclass' *是一個*'SkillBase'。相反的是**不是**。您不能將父類轉換爲子類。 – 2012-01-27 19:04:12

+0

@Lolmewn:我添加了一些真實的例子,看看。 – 2012-01-27 19:07:20

0

您只能向上投射,即將子類分配給超類參考。這樣想:Subclass通過添加新方法f()擴展了Superclass。現在Superclass不知道關於f()的任何事情,因此問題。

0

您可能正在使用instanceof錯誤。

由於SkillBase不是Subclass,因此運行系統正常崩潰。

其他的解決方法是正確的。

+0

哦,我明白了。謝謝,現在找到解決方法.. – Lolmewn 2012-01-27 19:04:01

0

s不能被強制轉換爲子類,因爲它不是實例化爲子類。這是一個技能基地。如果你想使用一個子類,爲什麼不實例化呢?

Subclass s = new Subclass(); 

,您仍然可以設置你想要,因爲他們通過野兔繼承Skillbase和演員不再是必要的參數。

+0

因爲我在for循環中,並且在執行其他操作之前必須檢查我正在查看的內容,但是如果其他內容失敗,這看起來是個不錯的選擇。 – Lolmewn 2012-01-27 19:01:50

0

問題是您沒有正確使用投射。一個類總是可以作爲它的父類而不是其他方式。其概念是,一個子類(根據定義)知道父類的結構,並且(根據定義)已經支持父類中的所有簽名。因此,父母是孩子的一個子集。

然而,反過來卻是不正確的。父類不瞭解子類和/或孩子是否爲其結構添加了額外的簽名。因此,無法告訴編譯器將父對象看作是一個子對象,並提供該對象在父對象中擁有的所有方法。外行人說,水(孩子)是一種液體(父母),但並非所有的液體都是水。因此,你想對液體進行的任何測量(即:數量,粘度等)對於水也適用,但不能反過來(例如:水的密度與油的密度完全不同)。

所以爲了讓這一切都回到你的情況,你可以投Subclass作爲Skillbase但不是相反。

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

等等