簡體   English   中英

為什么Java在運行時檢查類型與轉換的不兼容性,並且在編譯時鍵入不匹配轉換?

[英]Why in Java incompatibility of types to casting is checked at runtime and type mismatch to converting at compile time?

假設有2個班級。 Child延伸Parent

public class Parent {}

public class Child extends Parent {}

我知道以下代碼不正確:

Child obj = new Parent(); // causes java.lang.Error

要么

Child obj = (Child) new Parent(); // causes java.lang.ClassCastException

但我不明白為什么我在第一種情況下得到編譯錯誤 ,在第二種情況下得到運行時異常 畢竟,父母永遠不能轉換或投射到孩子身上。 為什么在編譯時沒有檢查第二種情況?

我會非常感謝一個明確而合理的想法!

Child obj = new Parent();

在這種情況下,如果Parent對象可以設置為Child引用,則編譯器會嘗試檢查(隱式轉換),並且當此轉換失敗時,會出現編譯時錯誤。

Child obj = (Child) new Parent();

在這種情況下,編譯器會看到您顯式地將Parent對象強制轉換為Child ,因此編譯器將其留給運行時來決定轉換是否有效,在某種意義上,開發人員負責轉換。 因此,如果此轉換失敗,則會出現運行時錯誤。

子obj = new Parent(); //導致java.lang.Error

不,不。 它會導致編譯錯誤。 根本不是一回事。 不要通過將不同的東西等同來混淆自己。

編譯器盡可能多地檢查,並將其余部分留給運行時。 在這種情況下,對Child的分配顯然是不正確的,可以在編譯時檢測到。 在編譯時無法檢測到另一種情況。

在第二種情況下,您使用顯式轉換。 這意味着基本上你告訴編譯器你知道將要發生什么。 這是告訴編譯器類型是什么的一種方式,所以他相信你。

然而運行時必須完成這項工作......他不能,所以他是理所當然地抱怨的人。

(他她?..)

原因是編譯器需要額外的工作來檢測這種情況,並且它無法在所有情況下都正確。 有時候將這個編譯錯誤作為額外的工作並不值得,但不是所有的時間。

雖然Parent的實例永遠不能是Child,但對Parent的引用實際上可能指向Child。 通常,如果將類型為Parent的表達式轉換為Child,則可能會成功。 要確定編譯器不能知道有關Parent類型表達式的額外信息。 在這種情況下,它是一個構造函數調用。 這是最簡單的情況,而且幾乎是唯一的情況,很明顯 ,Parent類型的表達式不能引用Child類型的實例。 為了這么小的好處,為編譯器添加額外的復雜性並不值得。

暫無
暫無

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

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