簡體   English   中英

為什么鑄造方向在原始類型中從大到小而在對象中從小到大?

[英]Why casting direction is big to small in primitive types and small to big with objects?

在 Java 中,我們需要在將 double(memory 尺寸大)轉換為 Integer(ZCD691B4957F098CD281Z 尺寸較小)時進行轉換

int x = (int) 4.3;

但是在對象的情況下,如果父 class 是“哺乳動物”(在 memory 大小中小),其子類是“人類”(在 memory 大小中大),因為獲得了更多屬性然后哺乳動物

然后

Mammal m = new Human(); //works without casting

但從小到大的轉換

Human h = (Human) m ; // needs casting 

提前致謝。

鑄造與 object 的大小無關:它與變量的范圍有關

“范圍”是指變量可以包含的各種不同值。 如果您從一個變量分配給另一個變量,其范圍是第一個變量的超集,則不需要強制轉換,因為您知道分配是可以的。 但是,當您將一個變量分配給另一個其范圍是子集的變量時,您確實需要進行強制轉換,因為分配可能是不可能的。

想象一下,您有兩個容器:一個塑料桶和一個金屬絲購物籃,大小相同。 顯然,任何你可以放在鐵絲籃里的東西,你都可以放在浴缸里。 但並不是所有可以放在浴缸里的東西都可以放在籃子里。 一堆蘋果,你可以。 但是一堆葡萄干,你不能——它們會從籃子的洞里掉下來。 因此,浴缸可以容納的物品范圍大於籃子可以容納的物品范圍,即使兩者的尺寸相同。

在這個類比中,鑄造就像檢查你移動的東西是否適合新容器。 將東西從籃子移到浴缸時不需要檢查,但從浴缸移到籃子時需要檢查,否則水果會弄得滿地都是。

在您的具體情況下,我們知道每個人都是哺乳動物,但並非每個哺乳動物都是人,因此哺乳動物類型變量的范圍大於人類類型變量的范圍。 我們也知道 double 的范圍(大約 2^1024 - -(2^1024))大於 int 的范圍(2^31-1 - -2^31)。 因此,在任何一種情況下從前者分配給后者都需要強制轉換,但從后者分配給前者則不需要。

當您使用原始類型時,您必須在有可能丟失信息時顯式地強制轉換。 例如, long是 64 位, int是 32。在int中轉換long會導致數據丟失(在這種情況下是 32 位)。

在處理對象時,這與多態性有關。 編譯器能夠確保每個Human都是Mammal 這里沒問題。 但無法保證每一個Mammal都是Human 您必須顯式轉換才能轉換引用類型。

您可以將顯式轉換視為對編譯器說“我知道您無法確保此數據轉換是安全的,但我知道我在做什么”的一種方式。

  1. 如果是原語 memory 起作用。如果您要像示例中那樣將 double 存儲到 int 中,則與 integer 相比,double 需要更多的 memory。你知道你在做什么,所以編譯器讓它去做。
  2. 在 object 的情況下,沒有 memory 的情況。只是多態性起作用。所以你可以將子類 object 變成超類型。

    希望你能得到它。

暫無
暫無

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

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