[英]Why casting to unrelated interface produce ClassCastException instead of compile time exception?
[英]Why does it compile when casting to an unrelated interface?
interface Printable {}
class BlackInk {}
public class Main {
public static void main(String args[]) {
Printable printable = null;
BlackInk blackInk = new BlackInk();
printable = (Printable)blackInk;
}
}
如果前面的代碼已編譯並運行,則結果為ClassCastException,其位置為printable = (Printable)blackInk;
。 但是,如果將Printable更改為一個類,則因為blackInk無法轉換為Printable而無法編譯。 當Printable是接口時,為什么要編譯?
編譯器不知道這是行不通的:您可能擁有實現Printable的BlackInk子類。 那演員就好了。
在編譯器知道它不起作用的情況下,您會得到一個錯誤。
例如,如果將BlackInk final
(這樣就不能有子類),則會出現錯誤。
對於編譯時引用類型S
(源)和編譯類型引用類型T
(目標); 在將S
轉換為T
, 如果S
是class
Type
如果T
是一個Class
類型 :
T
是的子類型S
或 S
是的子類型T
。 否則,將發生編譯時錯誤。 如果存在T
的超類型X
和S
的超類型Y
,從而X
和Y
都是可證明是截然不同的參數化類型,並且X
和Y
的擦除相同,則會發生編譯時錯誤 。
class S{} class T extends S{} //// S s = new S(); T t = (T)s; // run time ClassCastException will happen but no compile time error
如果T
是Interface
類型 :
S
不是final
類,那么,如果存在T
的超類型X
和S
的超類型Y
,使得X
和Y
都是可證明是截然不同的參數化類型,並且X
和Y
的刪除相同,發生編譯時錯誤 。 否則,強制轉換在編譯時始終合法( 因為即使S
不實現T
, S
的子類也可能 ) 這就是您的情況,即使在編譯時檢測到類強制轉換,在runtime
也檢測到接口強制轉換。
類型轉換在run time
發生(記住運行時多態性)。 編譯時,編譯器未發現代碼和編譯有任何問題,並且在運行時,它嘗試將類型blackink
為printable
blackink
鍵入,並且由於blackink
未實現printable
,因此無法這樣做,從而導致錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.