2015-10-18 52 views
1

讓有下面的類圖作爲例子接口和Java中的類

enter image description here

我做了Java中類似的類像下面

public class B { 

} 

public interface C { 

} 

public class A extends B implements C { 

} 

public class D { 
    C c = new A(); 
    C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ? 
    C c2 = (C) new B(); // Works fine. This makes me confuse ... What does this actually mean ? 
} 

任何人能解釋一下嗎?

+0

爲什麼我的問題是downvoted? – Junaid

+1

@Junaid忽略那些沒有評論的downvotes。 –

回答

0
C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ? 

您只能通過超類引用來引用派生類。在你的情況下,C是一個不是超類B。因此,錯誤

C c2 = (C) new B(); // This makes me confuse ... What does this actually mean ? 

編譯器不會允許您執行上述轉換。爲了從一種類型轉換到另一種類型,這兩個類必須位於相同的對象層次結構中。

1
C c1 = new B() 

你永遠不能實例B類爲C接口,因爲它沒有實現接口C.

C c2 = (C) new B() 

在你明確鑄造B的實例類型C.編譯器的第二個案例允許這一點,但你會得到一個運行時異常。

1

爲什麼C c2 = (C) new B();不能編譯:請參閱Ankur Shanbhag的答案。

C c2 = (C) new B();可編譯良好,但由於c2B對象,因此不能被轉換爲C,這將在運行時拋出異常。

我做了一個例子:

public class D { 
    public static void main(String[] args) { 
     C c2 = (C) new B();   
     System.out.println(c2); 
    } 
} 

並獲得了異常:

Exception in thread "main" java.lang.ClassCastException: casting.B cannot be cast to C

0

擴展方式 「是一種」。

A是一種B,所以它具有B的所有功能。

然而,B不是一種A,所以它不一定有A所有功能,包括實現interface C。這就是爲什麼你的類型不匹配。

但在這種情況下:

C c2 = (C) new B() 

鑄造告訴編譯器「不檢查這個,因爲我知道我在做什麼。」所以它可以編譯。

但是,如果在運行時的對象,你實際上投不能分型爲一個C,你會得到一個ClassCastException。在你的情況下,你投了一個BC,而B不是一種C不只是一種A。所以你會得到例外。