[英]Java error on casting a superclass obj to a subclass obj
我有一個愚蠢的Java問題,這是一個場景
Class A {}
Class AA extends A{}
AA aa = new AA()
A a = new A()
當我做
aa = (AA) a;
我在線程“ main” java.lang.ClassCastException中遇到諸如Exception之類的錯誤:無法轉換為AA
問題出在哪兒?
這是您的繼承層次結構
Object
|
A <--------- your object
|
AA
變量a
引用類型A
的對象,但是您試圖將其強制轉換為AA
。 這是不可能的,因為A
不是AA
。
AA
是A
,所以您可以做到
A a = new AA();
AA a = (AA) a;
但是您卻做了相反的事情。
您可以將子類實例轉換為超類,但不能將超類實例轉換為子類。
引用對象的變量可以與該對象具有相同的類型,也可以是該對象的任何超類型
SubType sub = new SuperType();
...將無法編譯,因為“ new SuperType()”返回類型SuperType的引用,並且編譯器知道SuperType不是子類型。
class Animal { }
class Dog extends Animal { }
class DogTest {
public static void main(String [] args) {
Animal animal = new Animal();
Dog d = (Dog) animal; // compiles but fails later
}
}
太瘋狂了! 此代碼編譯! 當我們嘗試運行它時,我們將收到類似以下的異常: java.lang.ClassCastException
為什么我們不能信任編譯器來幫助我們呢? 它看不到動物是動物類型的嗎?
編譯器所能做的就是驗證這兩種類型是否在同一個繼承樹中,以便根據垂降之前可能出現的任何代碼,動物可能是Dog類型的。 編譯器必須允許在運行時可能起作用的內容。
但是,如果編譯器確定地知道強制轉換可能無法進行,則編譯將失敗。
以下替換代碼塊將無法編譯 :
Animal animal = new Animal();
Dog d = (Dog) animal;
String s = (String) animal; // animal can't EVER be a String
在這種情況下,您會得到如下錯誤: 不可轉換類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.