亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java中的轉換變量

Java中的轉換變量

Helenr 2019-06-16 13:43:51
Java中的轉換變量我想知道有沒有人能告訴我演員是怎么工作的?我明白什么時候我應該這么做,但實際上不是這樣的。對于原始數據類型,我部分理解,但是當談到轉換對象時,我不理解它是如何工作的。一個有類型對象的對象怎么會突然被拋到,比如說,MyType(只是一個例子)然后得到所有的方法?
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

Java中的轉換不是魔術,而是告訴編譯器A類型的對象實際上是更具體的B類型,從而訪問B上的所有方法,否則就沒有了。在執行強制轉換時,您沒有執行任何魔術或轉換,您實際上是在告訴編譯器“相信我,我知道我在做什么,我可以向您保證,此行中的這個對象實際上是一個<INSERT CAST type Here”。例如:

Object o = "str";String str = (String)o;

上面的一切都很好,不是魔法,一切都很好。存儲在o中的對象實際上是一個字符串,因此我們可以在沒有任何問題的情況下轉換為字符串。

有兩種可能會出錯的方法。首先,如果您在完全不同的繼承層次結構中轉換兩種類型,那么編譯器就會知道您很傻,并阻止了您:

String o = "str";Integer str = (Integer)o; //Compilation fails here

第二,如果它們在相同的層次結構中,但仍然是無效的強制轉換,則ClassCastException將在運行時拋出:

Number o = new Integer(5);Double n = (Double)o; //ClassCastException thrown here

這實際上意味著您違背了編譯器的信任。您已經告訴它,您可以保證對象是特定類型的,而它不是。

你為什么需要演員?首先,您只需要在從更一般的類型到更特定的類型時才需要它。例如,Integer繼承自Number,所以如果您想存儲一個Integer作為Number那就可以了(因為所有的整數都是數字)。然而,如果你想反過來,你需要一個轉換-不是所有的數字都是整數(以及我們的整數)。DoubleFloatByteLong等等)而且,即使您的項目或JDK中只有一個子類,也可以很容易地創建另一個子類并分發它,所以即使您認為這是一個簡單的、顯而易見的選擇,也無法保證!

關于轉換的使用,您仍然可以在一些庫中看到對它的需求。PreJava-5在集合和各種其他類中大量使用,因為所有集合都在添加對象,然后轉換出返回集合的結果。然而,隨著泛型的出現,許多用于轉換的用途已經消失-它已經被泛型所取代,它提供了一種安全得多的替代方案,沒有ClassCastExceptions的潛力(實際上,如果您干凈地使用泛型,并且它編譯時沒有警告,您就可以保證永遠不會得到ClassCastException)。


查看完整回答
反對 回復 2019-06-16
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

實際上,演員并不總是有效的。如果對象不是instanceof你要把它扔給你的那個班會得到一個ClassCastException在運行時。


查看完整回答
反對 回復 2019-06-16
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

假設你想投一個String轉到File(是的,這沒有任何意義),您不能直接轉換它,因為File類不是子類,也不是String類(編譯器抱怨)。

但你可以投你的StringObject,因為StringObject (Object是父母)。然后,您可以將此對象轉換為File,因為文件是Object.

因此,從編譯時的輸入角度來看,您的所有操作都是“合法的”,但這并不意味著它將在運行時工作!

File f = (File)(Object) "Stupid cast";

即使沒有意義,編譯器也會允許這樣做,但是它會在運行時崩潰,只有這個例外:

Exception in thread "main" java.lang.ClassCastException:
    java.lang.String cannot be cast to java.io.File


查看完整回答
反對 回復 2019-06-16
  • 3 回答
  • 0 關注
  • 357 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號