簡體   English   中英

為什么轉換到不相關的接口會產生 ClassCastException 而不是編譯時異常?

[英]Why casting to unrelated interface produce ClassCastException instead of compile time exception?

為什么在這個片段中,雖然 Tree 接口與 Bug 類無關,但它不會產生編譯時異常?

interface Tree {}
class Bug {
    public static void main(String[] args) {
        Bug bug = new Bug();
        Tree tree = (Tree) bug;
    }
}

Bug標記為final ,您將按預期獲得編譯器錯誤。

這是因為Bug可以有一個子類,它的確實現Tree 如果bug實際上存儲了對該子類的實例的引用,則轉換將成功。 由於轉換有可能成功,編譯器不會阻止您進行轉換。

在大多數情況下,您可以從任何非 final 類轉換為任何接口。 根據 JLS §5.5.1 ,當您嘗試將引用類型S的變量轉換為接口T

如果 S 不是最終類(第 8.1.1 節),那么,如果存在 T 的超類型 X 和 S 的超類型 Y,使得 X 和 Y 都是可證明不同的參數化類型,並且 X 的擦除和 Y 相同,則發生編譯時錯誤。

否則,轉換在編譯時總是合法的(因為即使 S 沒有實現 T,S 的子類也可能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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