[英]ClassCastException
我在java中有兩個類:
class A {
int a=10;
public void sayhello() {
System.out.println("class A");
}
}
class B extends A {
int a=20;
public void sayhello() {
System.out.println("class B");
}
}
public class HelloWorld {
public static void main(String[] args) throws IOException {
B b = (B) new A();
System.out.println(b.a);
}
}
在編譯時它不會給出錯誤,但在運行時它會顯示錯誤:線程“main”中的異常java.lang.ClassCastException:A無法轉換為B
發生這種情況是因為new A()
的編譯時表達式類型是A
- 它可以是對B
實例的引用,因此允許轉換。
但是,在執行時,引用僅僅是A
的實例 - 因此它無法進行轉換。 只是A
的實例不是 B
的實例。 只有在引用確實引用了B
或子類的實例時,該轉換才有效。
B擴展A,因此B可以轉換為A.但反之則不然。 A的實例不能轉換為B.
如果你來自Javascript世界,你可能期望這個工作,但Java沒有“ 鴨子打字 ”。
首先這樣做:
A aClass = new B();
現在做你的顯式轉換,它會工作:
B b = (B) aClass;
這意味着顯式鑄造必須需要隱式鑄造。 elsewise不允許顯式轉換。
一旦創建了子類的對象,就無法將其類型轉換為superClass。 請看下面的例子
假設: Dog是繼承自Animal(SuperClass)的子類
正常的Typecast:
Dog dog = new Dog();
Animal animal = (Animal) dog; //works
錯誤的Typecast:
Animal animal = new Animal();
Dog dog = (Dog) animal; //Doesn't work throws class cast exception
下面的Typecast確實有效:
Dog dog = new Dog();
Animal animal = (Animal) dog;
dog = (Dog) animal; //This works
編譯器會在運行時檢查實際驗證內容的語法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.