2012-02-08 123 views
0

請告訴我爲什麼我在這種情況下爲什麼我收到ClassCastException異常在這種情況下

我有型鑄造,B類的源到低於如圖所示,但爲什麼我仍然得到拋出ClassCastException越來越ClassCastException異常這裏 。

public class A extends B 
{ 


} 

public class B { 
    public String getData() { 
     return "B"; 
    } 
} 


public class Main { 
    public static void main(String args[]) { 
     A a = new A(); 
     B b = new B(); 
     a = (A) b; 
     System.out.println(a.getData()); 
    } 
} 

回答

0

您無法將基類轉換爲派生類。你可以做其他的事情。

0

由於B一個實例是A一個實例。這真的很簡單。

如果您創建了A的實例,它也是B - 因爲這就是子類的含義。但是,如果創建B的實例,即而不是A,並且不能像這樣分配/投射。

只有當對象的運行時類與您要轉換的類型兼容時,才能進行強制轉換。你不能更改現有對象的類 - 這是我認爲你可能在這裏試圖做的 - 只告訴編譯器「看,我知道它確實是更具體的東西」。

因此,作爲一個反例,以下將工作:

public static void main(String args[]) { 
    B b = new A(); 
    A a = (A) b; 
    System.out.println(a.getData()); 
} 

在這種情況下,變量b聲明抱到一個B參考。事實證明,你用A的實例填充它,但對於程序的其餘部分,編譯器不允許假設bA,因爲它不能保證。由於您的知道在您的特定情況下它是A,因此您插入了強制轉換,這會導致運行時檢查對象實際上是否爲A。這成功了,從那一刻起,您可以調用a變量上特定於A的方法。

然而,在這種情況下,根本沒有理由進行任何投射 - 子類上沒有額外的方法需要調用,也沒有方法僅使用A而不使用B。即使A覆蓋getData做了一些不同的事情,如果通過B引用調用,仍然會出現此行爲。

0

因爲您的實例「b」不是A類型(B不擴展A),所以當您將「b」轉換爲A時,它將失敗。 相反會工作(鑄造型的實例B型)

2

它變得更明顯,如果我們用不同的類名玩:

public class Car extends SomethingWithWheels {} // was A extends B 
public class SomethingWithWheels {}    // was B 

public class Train extends SomethingWithWheels {} // aahh, some C extends B 

現在,再次讓投:

SomethingWithWheels somethingWithWheels = getItFromSomewhere(); 
Car car = (Car) somethingWithWheels; 

編譯器不得不抱怨,因爲somethingWithWheelsB)可能是一個Train實例(C),它不能被轉換爲CarA)。

0

您是向下傾斜的,並且您嘗試將超類型轉換爲子類型,這就是爲什麼它在編譯期間表現良好,但在運行時因ClassCastException失敗。

您可以撥打:

System.out.println(a.getData()); 

去除行之後,你嘗試投的類型

相關問題