簡體   English   中英

ClassCastException異常

[英]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.

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