[英]Compile time or Runtime for type casting/ type binding / type inference etc
[英]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.