Frage Warum ist die Casting-Richtung in primitiven Typen groß und klein zu groß mit Objekten?


In Java Wir brauchen Casting beim Konvertieren von Double (groß in Speichergröße) zu Integer (kleiner in Speichergröße)

int x = (int) 4.3;

Aber im Fall von Objekten, wenn die Elternklasse "Säugetier" ist (klein in der Speichergröße) und ihre Unterklasse ist "Mensch" (groß in der Speichergröße seit mehr Eigenschaften als Säugetier)

dann

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

aber kleine bis große Umwandlung

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

Danke im Voraus.


5
2017-08-12 08:32


Ursprung


Antworten:


Beim Casting geht es nicht um die Größe des Objekts: es geht um die Bereich der Variablen.

Mit 'Bereich' meine ich die Vielfalt verschiedener Werte, die die Variable enthalten kann. Wenn Sie eine Variable einer anderen Variablen zuordnen, deren Bereich eine Obermenge der ersten ist, müssen Sie nicht umwandeln, weil Sie wissen, dass die Zuweisung in Ordnung ist. Wenn Sie jedoch eine Variable einer anderen Variable zuweisen, deren Bereich eine Teilmenge ist, müssen Sie eine Umwandlung durchführen, da die Zuweisung möglicherweise nicht möglich ist.

Stellen Sie sich vor, Sie haben zwei Behälter: eine Kunststoffwanne und einen Drahtkorb gleicher Größe. Klar, alles, was du im Drahtkorb behalten kannst, kannst du in der Wanne behalten. Aber nicht alles, was Sie in der Wanne aufbewahren können, kann im Korb aufbewahrt werden. Ein Haufen Äpfel, das kannst du. Aber ein Haufen Rosinen kann nicht - sie würden durch die Löcher im Korb fallen. So ist die Auswahl der Dinge, die die Wanne halten kann, größer als die Palette der Dinge, die der Korb halten kann, obwohl beide die gleiche Größe haben.

In dieser Analogie ist Casting wie das Überprüfen, ob das Ding, das du bewegst, in den neuen Behälter passt. Sie müssen nicht überprüfen, wenn Sie Dinge aus dem Korb in die Wanne bewegen, aber Sie müssen überprüfen, wenn Sie von der Wanne in den Korb bewegen, sonst werden Sie mit Früchten auf dem ganzen Boden enden.

In Ihren speziellen Fällen wissen wir, dass jeder Mensch ein Säugetier ist, aber nicht jedes Säugetier ein Mensch ist, daher ist der Bereich einer Variablen vom Typ Mammal größer als der einer Variablen vom Typ Mensch. Wir wissen auch, dass der Bereich eines Doppelten (ungefähr 2 ^ 1024 - - (2 ^ 1024)) größer ist als der eines int (2 ^ 31-1 - -2 ^ 31). Also erfordert die Zuordnung von der ersten zu der letzteren in beiden Fällen eine Besetzung, aber von letzterer zur ersteren nicht.


6
2017-08-12 08:36



Wenn Sie primitive Typen verwenden, müssen Sie explizit festlegen, wenn die Gefahr besteht, dass Sie Informationen verlieren. Beispielsweise, long ist 64 Bits und int ist 32. Konvertieren a long in einem (n int kann zu Datenverlust führen (in diesem Fall 32 Bit).

Im Umgang mit Objekten ist dies relativ zum Polymorphismus. Der Compiler ist in der Lage, sicherzustellen, dass jeder Human ist ein Mammal. Kein Problem hier. Aber es ist nicht in der Lage, sicherzustellen, dass jeder Mammal ist ein Human. Sie müssen explizit umwandeln, um den Referenztyp zu konvertieren.

Sie können explizite Umwandlungen als eine Möglichkeit sehen, dem Compiler zu sagen: "Ich weiß, dass Sie nicht sicherstellen können, dass diese Datenkonvertierung sicher ist, aber ich weiß, was ich tue".


6
2017-08-12 08:36



  1. Im Falle von Primitiven Speicher kommt ins Spiel.Wenn Sie Double in int wie in Ihrem Beispiel speichern, nimmt Double mehr Speicher als im Vergleich zu Integer.So gibt es die Chance, Daten zu verlieren.So Compiler werfen Fehler.Wenn Sie sich dann selbst zu werfen Sie wissen, was Sie tun, so Compiler lassen Sie das tun.
  2. Im Falle eines Objekts, kein Fall von Speicher dort.Nur ein Polymorphismus kommt ins Spiel.So können Sie ein Unterklassenobjekt in einen Übertyp bringen.

    Ich hoffe, du wirst es bekommen.


1
2017-08-12 08:41