[英]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
。
用現實世界來思考:因為每只狗都是動物* ,所以您總是可以將Dog
為Animal
* ,但是由於某些動物不是狗,因此將Animal
為Dog
可能會失敗。
*實際上,編譯器會為您執行此操作,這被稱為多態
您只能向上廣播,即將子類分配給超類引用。 這樣考慮: Subclass
Superclass
通過添加新方法f()
擴展了Superclass
。 現在, Superclass
對f()一無所知,因此也不知道問題所在。
您可能使用了instanceof
錯誤。
由於SkillBase
不是Subclass
,因此運行時很容易崩潰。
反之亦然。
s不能轉換為Subclass,因為它沒有實例化為Subclass。 這是一個技能庫。 如果要使用子類,為什么不實例化它?
Subclass s = new Subclass();
您仍然可以設置所需的參數,因為它們已由Skillbase繼承,並且不再需要強制轉換。
問題是您沒有正確使用投射。 始終可以將一個類強制轉換為其父類,但反之則不能。 概念是子類(按定義)知道父級的結構,並且(按定義)已經支持父級中的所有簽名。 因此,父母是孩子的子集。
但是,反事實並非如此。 父類對子類一無所知,並且/或者子代是否對其結構添加了額外的簽名。 因此,沒有辦法告訴編譯器將父級視為子級,並使子級在父級中擁有的所有方法可用。
通俗地說,水(孩子)是液體(父母),但並非所有液體都是水。 因此,您要在液體上進行的任何測量(即:數量,粘度等)也適用於水,但反之亦然(例如:水的密度與油的密度完全不同)。
因此,為了使這一切回到您的情況,您可以將Subclass
為Skillbase
不行。
Subclass instanceof Skillbase == true
(Skillbase) new Subclass() - also valid
(SKillbase) new Sub#2 - also valid
等等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.